关于c#:与或运算符之间的区别是什么?

What is the difference between the | and || or operators?

我一直在or表达式中使用||(两个管道),在c和php中都使用。偶尔我会看到一根管子:|。这两种用法有什么区别?使用时有没有注意事项,或者它们是可以互换的?


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

例如:

1
if(condition1 || condition2 || condition3)

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

1
if(condition1 | condition2 | condition3)

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

有一个大警告,空引用或类似的问题。例如:

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

如果class为空,则if语句将在class != null为假后停止。如果您只使用&;,它将尝试检查class.someVar,您会得到一个不错的NullReferenceException。对于"或"运算符,这可能不是一个很大的陷阱,因为您不太可能触发坏的事件,但需要记住这一点。

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

不过,还有第二种使用|&运算符:按位运算。


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

1
condition1 || condition2

如果Condition1或Condition2为true,则计算结果为true。

|是按位或运算符。它用来操作两个数字。您可以分别查看每个数字的每个位,如果其中一个位在至少一个数字中是1,那么得到的位也将是1。以下是几个例子:

1
2
3
4
5
6
7
8
9
10
11
12
A = 01010101
B = 10101010
A | B = 11111111

A = 00000001
B = 00010000
A | B = 00010001

A = 10001011
B = 00101100

A | B = 10101111

希望这是有道理的。

因此,为了回答最后两个问题,我不会说除了"知道两个操作符之间的区别"之外还有任何警告。它们不能互换,因为它们做了两个完全不同的事情。


一个是"位或"。

10011b | 01000b => 11011b

另一个是逻辑或。

true or false => true


好问题。这两个操作符在php和c中工作相同。

|是位或。它将按位比较两个值。例如1101 0010=1111。这在使用位选项时非常有用。例如,read=01(0x01)write=10(0x02)read-write=11(0x03)。一个有用的例子是打开文件。一个简单的例子是:

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

||是逻辑或。这是大多数人根据自己的真实性来思考或比较两种价值观的方式。我要去商店,否则我要去商场。这是代码中最常用的一个。例如。

1
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


Java中的简单示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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;
  }
}

输出:

1
2
3
4
5
6
using double pipe
x = 5
y = 0
using single pipe
x = 5
y = 5


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

&;&;-(条件1&;条件2):如果情况1,不必检查第二个情况是假的

&;&;-运算符将使代码运行更快,很少使用专业的代码

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

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

||-操作员将使您的代码运行更快,很少使用专业


根据它们的数学定义,或和是二元运算符;它们验证lhs和rhs条件,与和&;类似。

||以及&;更改或和运算符的属性,方法是在lhs条件未满足时停止它们。


单管是按位运算符之一。

维基百科:

In the C programming language family, the bitwise OR operator is"|" (pipe). Again, this operator must not be confused with its Boolean"logical or" counterpart, which treats its operands as Boolean values, and is written"||" (two pipes).


单管""是"位"或,仅当您知道自己在做什么时才应使用。双管""是逻辑或,可用于逻辑语句,如"x==0 x==1"。

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


运算符执行其两个操作数的按位"或"运算(意味着两侧必须计算为"假"才能返回"假"),而运算符仅在需要时计算第二个运算符。

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

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


||(两个管道)通常是逻辑或,而(一个管道)是二进制或。从我的头顶上看,我想不出任何时候这两者之间的差别会是多么大(除了当你把结果分配给其他东西的时候)。但是我相信其他人会有一个重要的情况。

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


单个管道()是按位或运算符。

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

它们不能互换。


位()对逻辑()!把逻辑看作Java中的可比较对象,比较一些可区分的"部分",而位运算符查看这些对象,而不是看它们是否是视觉孪生(如逻辑DO),而是做一个DNA样本,并查看0和1。