2008-08-29 83 views
231

我总是在OR表达式中使用||(两个管道),无论是C#还是PHP。偶尔我会看到使用的单根管道:|。这两种用法有什么区别?在使用其他产品时是否有任何注意事项,或者它们是否可以互换?|有什么区别?和||或运营商?

回答

380

就像&&&操作符一样,双操作符是一个“短路”操作符。

例如:

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

+42

不知道为什么这是获得downvoted - 这是正确的!如果你不相信他,请在编译器中仔细检查它! – 2008-09-06 08:07:10

+8

是的,我直到我创建了一个控制台应用程序才相信它 - 但是很好的领主!他们为什么会给你绳索挂上你自己!我讨厌VB.NET - OrElse和AndAlso关键字! – 2008-09-06 08:09:52

26

一个是“按位或”。

10011b | 01000b => 11011b

另一种是逻辑或。

true or false => true

0

的烧毛管道 “|”是“按位”还是只能在知道自己在做什么时才使用。双管“||”是逻辑或,并且可以在逻辑语句中使用,如“x == 0 || x == 1”。下面是一个按位或者做什么的例子:如果a = 0101和b = 0011,那么a | b = 0111。如果您正在处理将任何非零值视为true的逻辑系统,那么按位或将按照与逻辑或的方式相同的方式进行操作,但它是对等的(按位和“&”)将不会。也按位或不执行短路评估。

-1

单个管道(|)是bitwise OR operator

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

它们不可互换。

+0

如果忽略按位运算,则在逻辑运算符区域内,双管道是惰性评估,单管道是贪婪的。 – Alex 2013-10-31 15:43:31

-1

|| (两管)通常是逻辑或者同时| (一个管道)是二进制或。除了我的头顶,我想不出任何时候这个差异会成为一个大问题(除了将结果分配给其他人时)。不过,我确定别人会有一个重要的情况。

编辑:哇,在我写这篇文章的时候,还有其他六个答案。

66

||是逻辑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 

希望这是有道理的。

所以要回答最后两个问题,除了“知道两个操作员之间的区别”之外,我不会说有任何警告。他们不可互换,因为他们做了两件完全不同的事情。

10

好问题。这两个运算符在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

1

单管,|,是bitwise运营商之一。

维基百科:

在C程序设计语言的家庭,按位或运算符是 “|” (管)。同样,这个操作符不能与它的布尔逻辑或对应物相混淆,它将操作数当作布尔值处理,并写成“||” (两根管子)。

-1

按位(|)与逻辑(||)! 将逻辑看作Java中的Comparable对象,比较一些可区分的“部分”,而按位运算符查看这些对象,而不是查看它们是否是可视化的双胞胎(如逻辑),做DNA样本并查看0和1代替。在Java中

3

简单的例子

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 
0

通过他们的数学定义,OR和AND是二元操作;无论如何,他们都会验证LHS和RHS条件,类似于|和&。

||和& &通过在LHS条件未满足时停止它们来更改OR和AND运算符的属性。

1

& - (条件1个&条件2):检查这两种情况下,即使第一个是假

& & - (条件1 & &条件2):这么想的打扰如果情况下,一个检查第二壳体 是假

& & - 运营商将会使你的代码运行速度更快,专业&很少使用

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

|| - (条件1个||条件2):这么想的麻烦,以检查第二情况下,如果第一 之一为真

|| - 运营商将使你的代码更快,更专业|很少使用