我总是在OR表达式中使用||
(两个管道),无论是C#还是PHP。偶尔我会看到使用的单根管道:|
。这两种用法有什么区别?在使用其他产品时是否有任何注意事项,或者它们是否可以互换?|有什么区别?和||或运营商?
回答
就像&
和&&
操作符一样,双操作符是一个“短路”操作符。
例如:
if(condition1 || condition2 || condition3)
如果条件1为真,条件2和3将不会检查。
if(condition1 | condition2 | condition3)
这将检查条件2和3,即使1已经为真。由于你的条件可能是相当昂贵的功能,你可以通过使用它们来获得很好的性能提升。
有一个很大的警告,NullReferences或类似的问题。例如:
if(class != null && class.someVar < 20)
如果类为null,if语句将停止后class != null
是假的。如果你只使用&,它会尝试检查class.someVar
,你会得到一个不错的NullReferenceException
。由于Or运算符可能不是一个陷阱,因为它不太可能触发一些不好的事情,但需要牢记。
虽然没有人使用单个&
或|
运算符,除非您有一个设计,其中每个条件都是要执行的函数。听起来像是一种设计气味,但有时(很少)它是一种干净的做事方式。 &
运算符“运行这3个函数,如果其中一个返回false,执行else块”,而|
“只运行else块,如果没有返回false” - 可能是有用的,但如前所述,通常它是一种设计气味。
有|
和&
运营商的第二次使用,但:Bitwise Operations。
一个是“按位或”。
10011b | 01000b => 11011b
另一种是逻辑或。
true or false => true
The |运算符对其两个操作数执行按位或运算(意味着双方必须计算为false,以使其返回false),而||运营商只会在需要时评估第二个运营商。
http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
如果您实际阅读这些文章,您会发现它们指的是按位运算符 – johnc 2009-03-02 03:01:21
的烧毛管道 “|”是“按位”还是只能在知道自己在做什么时才使用。双管“||”是逻辑或,并且可以在逻辑语句中使用,如“x == 0 || x == 1”。下面是一个按位或者做什么的例子:如果a = 0101和b = 0011,那么a | b = 0111。如果您正在处理将任何非零值视为true的逻辑系统,那么按位或将按照与逻辑或的方式相同的方式进行操作,但它是对等的(按位和“&”)将不会。也按位或不执行短路评估。
如果忽略按位运算,则在逻辑运算符区域内,双管道是惰性评估,单管道是贪婪的。 – Alex 2013-10-31 15:43:31
|| (两管)通常是逻辑或者同时| (一个管道)是二进制或。除了我的头顶,我想不出任何时候这个差异会成为一个大问题(除了将结果分配给其他人时)。不过,我确定别人会有一个重要的情况。
编辑:哇,在我写这篇文章的时候,还有其他六个答案。
||是逻辑OR运算符。这听起来像你基本上知道那是什么。它用于条件语句,如if,while等。
condition1 || condition2
如果条件1或条件2为真,则计算结果为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
||是一个逻辑或。这是大多数人认为OR的方式,并根据他们的真实情况比较两个值。例如。我要去商店,否则我会去商场。这是代码中经常使用的一种。例如。
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/en-us/library/kxszd0kx(VS.71).aspx
http://msdn.microsoft.com/en-us/library/6373h346(VS.71).aspx
单管,|,是bitwise运营商之一。
维基百科:
在C程序设计语言的家庭,按位或运算符是 “|” (管)。同样,这个操作符不能与它的布尔逻辑或对应物相混淆,它将操作数当作布尔值处理,并写成“||” (两根管子)。
按位(|)与逻辑(||)! 将逻辑看作Java中的Comparable对象,比较一些可区分的“部分”,而按位运算符查看这些对象,而不是查看它们是否是可视化的双胞胎(如逻辑),做DNA样本并查看0和1代替。在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
通过他们的数学定义,OR和AND是二元操作;无论如何,他们都会验证LHS和RHS条件,类似于|和&。
||和& &通过在LHS条件未满足时停止它们来更改OR和AND运算符的属性。
& - (条件1个&条件2):检查这两种情况下,即使第一个是假
& & - (条件1 & &条件2):这么想的打扰如果情况下,一个检查第二壳体 是假
& & - 运营商将会使你的代码运行速度更快,专业&很少使用
| - (条件1 |条件2):检查这两种情况下,即使案件1为真
|| - (条件1个||条件2):这么想的麻烦,以检查第二情况下,如果第一 之一为真
|| - 运营商将使你的代码更快,更专业|很少使用
不知道为什么这是获得downvoted - 这是正确的!如果你不相信他,请在编译器中仔细检查它! – 2008-09-06 08:07:10
是的,我直到我创建了一个控制台应用程序才相信它 - 但是很好的领主!他们为什么会给你绳索挂上你自己!我讨厌VB.NET - OrElse和AndAlso关键字! – 2008-09-06 08:09:52