我总是在OR表达式中使用||(两个管道),无论是在c#还是PHP中。我偶尔会看到使用单个管道:|。这两种用法有什么区别?使用其中一种时有什么注意事项吗?或者它们是可以互换的吗?


当前回答

||是逻辑或运算符。听起来你基本知道那是什么。它用于条件语句,如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

希望你们能理解。

所以为了回答最后两个问题,我不会说除了“知道两个运算符之间的区别”之外还有什么需要注意的。它们不能互换,因为它们做的是两种完全不同的事情。

其他回答

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

例如:

if(condition1 || condition2 || condition3)

如果条件1为真,条件2和条件3将不被检查。

if(condition1 | condition2 | condition3)

这将检查条件2和3,即使1已经为真。由于您的条件可能是相当昂贵的函数,您可以通过使用它们获得良好的性能提升。

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

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

如果class为空,If语句将在class != null为false后停止。如果你只使用&,它将尝试检查类。someVar,你得到一个NullReferenceException。对于or -算子,这可能不是一个陷阱,因为你不太可能触发一些不好的事情,但这是要记住的事情。

但是,没有人会使用单个的&或|操作符,除非在设计中,每个条件都是必须执行的函数。听起来像是一种设计的味道,但有时(很少)这是一种干净的做事方式。&操作符“运行这3个函数,如果其中一个返回false,则执行else块”,而|“如果没有返回false,则只运行else块”——可能很有用,但如前所述,这通常是一种设计味道。

|和&运算符还有第二种用法:位操作。

根据数学定义,OR和and是二进制运算符;他们会验证LHS和RHS条件,类似于|和&。

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

一个是“按位或”。

10011b | 01000b => 11011b

另一种是逻辑或。

True或false => True

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

||是逻辑或运算符。听起来你基本知道那是什么。它用于条件语句,如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

希望你们能理解。

所以为了回答最后两个问题,我不会说除了“知道两个运算符之间的区别”之外还有什么需要注意的。它们不能互换,因为它们做的是两种完全不同的事情。