Answers:
就像&
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 != null
false 之后停止。如果仅使用&,它将尝试检查class.someVar
并得到一个不错的NullReferenceException
。对于Or-Operator来说,这并不是一个陷阱,因为您不太可能触发不良事件,但要记住这一点。
但是,没有人会使用“单” &
或“ |
运算符”,除非您设计的每个条件都是要执行的功能。听起来像是一种设计气味,但有时(很少)是一种做事的干净方法。该&
操作者“跑这3个功能,如果其中一个返回false,执行else块”,而|
不会“只运行else块,如果没有回报假” -可能是有用的,但正如所说,往往这是一个设计闻。
尽管有|
and &
运算符的第二种用法:按位运算。
&
,并|
作为条件运算符是一个黑客,并得到他们的麻烦,如果他们在任何时候需要用C / C ++: 1 && 2
是真的,同时1 & 2
是假的。
&
传达一种含义,而不是几乎总是意味着的含义:按位与)。
|| 是逻辑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
希望这是有道理的。
因此,要回答最后两个问题,除了“了解两个运算符之间的区别”之外,我不会说其他任何警告。它们不可互换,因为它们做了两种完全不同的事情。
好问题。这两个运算符在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
|
是合乎逻辑的或应用于布尔值时。作为您的链接参考状态。在实践中,最终结果是一样的,如果它是一个按位操作,因为按位值true
和false
使得按位或它们的值的产生完全相同的结果作为一个逻辑或一样。那是(int)(bool1 | bool2)
== ((int)bool1) | ((int)bool2)
。
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
| 运算符对两个操作数执行“按位或”运算(这意味着双方都必须求值为false才能返回false),而|| 操作员仅在需要时才评估第二个操作员。
http://msdn.microsoft.com/zh-CN/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/zh-CN/library/6373h346(VS.71).aspx
单管“ |” 是“按位”,或者仅当您知道自己在做什么时才使用。双管“ ||” 是逻辑或,可以在逻辑语句中使用,例如“ x == 0 || x == 1”。
这是按位或操作的示例:如果a = 0101和b = 0011,则a | b = 0111。如果您要处理的逻辑系统会将任何非零视为真,则按位或将以与逻辑或相同的方式工作,但是与之相对的(按位和,“&”)则不会。也按位或不执行短路评估。
bool
没有短路的类型。