| |之间有什么区别?和|| 还是运营商?


300

我一直||在C#和PHP的OR表达式中使用过(两个管道)。有时我会看到一个管道:|。这两种用法有什么区别?在彼此之间使用时是否存在一些警告或可以互换?

Answers:


488

就像&and &&运算符一样,double运算符也是“短路”运算符。

例如:

if(condition1 || condition2 || condition3)

如果condition1为true,则不会检查条件2和3。

if(condition1 | condition2 | condition3)

即使1已经为真,这也会检查条件2和3。由于您的条件可能是非常昂贵的功能,因此可以通过使用它们来提高性能。

有一个很大的警告,NullReferences或类似的问题。例如:

if(class != null && class.someVar < 20)

如果class为null,则if语句将在class != nullfalse 之后停止。如果仅使用&,它将尝试检查class.someVar并得到一个不错的NullReferenceException。对于Or-Operator来说,这并不是一个陷阱,因为您不太可能触发不良事件,但要记住这一点。

但是,没有人会使用“单” &或“ |运算符”,除非您设计的每个条件都是要执行的功能。听起来像是一种设计气味,但有时(很少)是一种做事的干净方法。该&操作者“跑这3个功能,如果其中一个返回false,执行else块”,而|不会“只运行else块,如果没有回报假” -可能是有用的,但正如所说,往往这是一个设计闻。

尽管有|and &运算符的第二种用法:按位运算


9
是的,直到我创建了控制台应用程序,我才相信它-但是,天哪!他们为什么会给您绳子来吊死自己!我讨厌VB.NET-OrElse和AndAlso关键字!
Jarrod Dixon

24
教人使用&,并|作为条件运算符是一个黑客,并得到他们的麻烦,如果他们在任何时候需要用C / C ++: 1 && 2是真的,同时1 & 2是假的。
BlueRaja-Danny Pflughoeft 2010年

47
它不是黑客,而是在7.10.3节布尔逻辑运算符中为C#正式指定的:“如果x或y为true,则x | y的结果为true。否则,结果为false。” 另请参见第7.11节条件逻辑运算符:“运算x || y对应于运算x | y,除了y仅在x为false时才求值。” 进一步“合法化” | 作为条件运算符。如果使用C / C ++的人盲目地认为这些东西同样有效,那么他们无论如何都会遇到麻烦。如前所述:if语句中是设计气味,但是完全合法。
Michael Stum

9
我从来没有说过这是不合法的,只是说它是一种hack (您正在&传达一种含义,而不是几乎总是意味着的含义:按位与)
BlueRaja-Danny Pflughoeft 2012年

15
@ BlueRaja-DannyPflughoeft当文档说打算使用该功能时,将其称为hack,就像使用switch语句“ anotherif hack”那样。它是工具箱中的一种工具,也许是一种很少使用的专用工具,但并非总是如此。
根特2014年

80

|| 是逻辑OR运算符。听起来您基本上知道那是什么。它用于条件语句中,例如if,while等。

condition1 || condition2

如果condition1或condition2为true,则求值为true。

| 是按位或运算符。它用于对两个数字进行运算。您分别查看每个数字的每一位,如果至少一个数字中的一位为1,则结果位也将为1。这里有一些例子:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的。

因此,要回答最后两个问题,除了“了解两个运算符之间的区别”之外,我不会说其他任何警告。它们不可互换,因为它们做了两种完全不同的事情。


这有助于我理解有人如何使用位或运算符合并Mongodb C#驱动程序中的过滤器。gist.github.com/a3dho3yn/...
唐尼五,

30

一个是“按位或”。

10011b | 01000b => 11011b

另一个是逻辑或。

正确还是错误=> true


2
|也可以在bool没有短路的情况下用于各种类型。
juharr

14

好问题。这两个运算符在PHP和C#中的工作方式相同。

|是按位或。它将按位比较两个值。例如1101 | 0010 =1111。这在使用位选项时非常有用。例如,读取= 01(0X01)写入= 10(0X02)写入= 11(0X03)。一个有用的例子是打开文件。一个简单的例子是:

File.Open(FileAccess.Read | FileAccess.Write);  //Gives read/write access to the file

||是逻辑或。这是大多数人对“或”的看法,并根据其真实性比较两个值。例如,我要去商店,否则我将去购物中心。这是代码中最常使用的代码。例如:

if(Name == "Admin" || Name == "Developer") { //allow access } //checks if name equals Admin OR Name equals Developer

PHP资源:http//us3.php.net/language.operators.bitwise

C#资源:http//msdn.microsoft.com/zh-cn/library/kxszd0kx(VS.71).aspx

http://msdn.microsoft.com/zh-CN/library/6373h346(VS.71).aspx


4
FWIW,从技术上讲,在C#中|合乎逻辑的或应用于布尔值时。作为您的链接参考状态。在实践中,最终结果是一样的,如果它是一个按位操作,因为按位值truefalse使得按位或它们的值的产生完全相同的结果作为一个逻辑或一样。那是(int)(bool1 | bool2)== ((int)bool1) | ((int)bool2)
ToolmakerSteve

4

Java中的简单示例

public class Driver {

  static int x;
  static int y;

public static void main(String[] args) 
throws Exception {

System.out.println("using double pipe");
    if(setX() || setY())
        {System.out.println("x = "+x);
        System.out.println("y = "+y);
        }



System.out.println("using single pipe");
if(setX() | setY())
    {System.out.println("x = "+x);
    System.out.println("y = "+y);
    }

}

 static boolean setX(){
      x=5;
     return true;
  }
 static boolean setY(){
      y=5;
      return true;
  }
}

输出:

using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5

2
您为什么要举一个Java示例来回答一个甚至没有提到Java的问题?
juharr

4

&-(条件1和条件2):即使第一个为假,也要检查两种情况

&&-(条件1和&条件2):如果情况为假,则不必费心检查第二种情况

&&-运算符将使您的代码运行更快,更专业,并且很少使用

| -(条件1 |条件2):即使情况1为真,也检查两种情况

|| -(条件1 ||条件2):如果第一种情况为真,则不必检查第二种情况

|| -运算符将使您的代码更专业地运行!很少使用


2
rarely used?一切取决于您想要或需要做什么。
Emaborsa

1
大!简短而有趣的是,我将删除“ |很少使用”和“&很少使用”,因为正如Emaborsa所说,它实际上取决于您想要或需要做的事情。
伊恩尼克

0

单个管道|是按位运算符之一。

从维基百科:

在C编程语言家族中,按位OR运算符为“ |” (管)。同样,该运算符一定不要与布尔运算符“逻辑或”混淆,后者将其操作数视为布尔值,并写为“ ||” (两个管道)。


0

按照它们的数学定义,OR和AND是二进制运算符;他们会验证LHS和RHS条件,与| 和&。

|| 当LHS条件不满足时,通过停止OR和AND运算符的属性来改变它们的属性。



-1

单管“ |” 是“按位”,或者仅当您知道自己在做什么时才使用。双管“ ||” 是逻辑或,可以在逻辑语句中使用,例如“ x == 0 || x == 1”。

这是按位或操作的示例:如果a = 0101和b = 0011,则a | b = 0111。如果您要处理的逻辑系统会将任何非零视为真,则按位或将以与逻辑或相同的方式工作,但是与之相对的(按位和,“&”)则不会。也按位或不执行短路评估。


'|' 也可以用于bool没有短路的类型。
juharr

-2

单个管道(|)是按位OR运算符

两个管道(||)是逻辑OR运算符。

它们不可互换。


1
如果忽略按位运算,则在逻辑运算符区域内,双管道是惰性计算,单管道是贪婪的。
亚历克斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.