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

时间:2008-08-29 21:11:18

标签: c# php operators

我总是在OR表达式中使用||(两个管道),包括C#和PHP。偶尔我会看到使用一个管道:|。这两种用法有什么区别?当使用一个而不是另一个时是否有任何警告或者它们是否可以互换?

14 个答案:

答案 0 :(得分:444)

就像&&&运算符一样,双运算符是一个“短路”运算符。

例如:

if(condition1 || condition2 || condition3)

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

if(condition1 | condition2 | condition3)

这将检查条件2和3,即使1已经为真。由于你的条件可能是非常昂贵的功能,你可以通过使用它们来获得良好的性能提升。

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

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

如果class为null,则if语句将在class != null为false后停止。如果您只使用&amp;,则会尝试检查class.someVar并获得一个不错的NullReferenceException。使用Or-Operator可能不是那么多陷阱,因为你不太可能触发坏事,但这是要记住的事情。

除非你的设计中每个条件都是要执行的函数,否则没有人会使用单个&|运算符。听起来像是一种设计气味,但有时(很少)这是一种干净的做事方式。 &运算符执行“运行这三个函数,如果其中一个返回false,则执行else块”,而|执行“只运行else块,如果没有返回false” - 可以是有用,但正如所说的,它通常是一种设计气味。

|&运算符的第二次使用虽然:Bitwise Operations

答案 1 :(得分:70)

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

condition1 || condition2

如果条件1或条件2为真,则求值为真。

|是按位OR运算符。它用于操作两个数字。您可以单独查看每个数字的每个位,如果其中一个位在至少一个数字中为1,那么结果位也将为1。以下是一些例子:

A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的。

所以为了回答最后两个问题,除了“了解两个运营商之间的区别”之外,我不会说任何警告。它们不可互换,因为它们做了两件完全不同的事情。

答案 2 :(得分:27)

一个是“按位或”。

  

10011b | 01000b =&gt; 11011B

另一个是逻辑或。

  

true或false =&gt;真

答案 3 :(得分:10)

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

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

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

||是一个逻辑OR。这是大多数人对OR的看法,并根据他们的真相比较两个值。例如。我要去商店,否则我会去商场。这是代码中最常用的一个。 E.g。

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

答案 4 :(得分:3)

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

答案 5 :(得分:2)

&安培; - (条件1和条件2):检查两种情况,即使第一种情况为假

&安培;&安培; - (条件1&amp;&amp;条件2):如果是第一种情况,则不必费心去检查第二种情况                                    是假的

&安培;&安培; - 运营商将使您的代码更快,专业和更快地运行很少使用

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

|| - (条件1 ||条件2):如果是第一个,请不要再检查第二种情况                                    一个是真的

|| - 运营商将使您的代码在专业上更快地运行很少使用

答案 6 :(得分:0)

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

来自维基百科:

  

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

答案 7 :(得分:0)

根据他们的数学定义,OR和AND是二元运算符;他们无论如何都要验证LHS和RHS条件,与|相似和&amp ;.

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

答案 8 :(得分:0)

对于按位let usersIdList = users .filter(u => u.website == SOME_WEBSITE) .map(u => u.id); 和Logicall const example = { some: 'Some', another: 'Another', theOne: function() { console.log(this.setTimeOut) }.bind(global) }

OR

按位|和逻辑||

这意味着& 在这第一个左边的&&中,将对 if( a>b | a==0)进行评估,然后对a>b进行操作

但是在a==0中,则如果不检查下一个RHS

与&和&&

类似

|

它将先评估LHS,然后再评估RHS,然后按位进行&,但是

|| if a>b

if(A>0 & B>0)(A>0 && B>0)(LHS),它将直接if(A>0)

答案 9 :(得分:-1)

|运算符执行其两个操作数的按位OR(意味着双方必须求值为false才能返回false)而||如果需要,运营商只会评估第二个运营商。

http://msdn.microsoft.com/en-us/library/kxszd0kx(VS.71).aspx

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

答案 10 :(得分:-1)

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

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

答案 11 :(得分:-2)

单个管道(|)是bitwise OR operator

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

它们不可互换。

答案 12 :(得分:-2)

|| (两个管道)通常是逻辑或while | (一个管道)是二进制或。在我的头脑中,我想不出任何时候差异将是一个大问题(除了你将结果分配给其他东西)。但是我相信其他人会有重要的情况。

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

答案 13 :(得分:-4)

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