逻辑和条件AND之间的区别是什么,在C#中是OR?

时间:2010-06-30 23:22:47

标签: c# conditional-operator logical-operators

  

可能重复:
  What is the diffference between the | and || or operators?

逻辑AND和OR:

(x & y)
(x | y)

条件AND和OR:

(x && y)
(x || y)

到目前为止,我只知道条件操作数。我知道它的作用以及如何在if语句中应用它。但逻辑操作数的目的是什么?

3 个答案:

答案 0 :(得分:77)

我更倾向于将其视为“按位与条件”而不是“逻辑与条件”,因为“逻辑”的一般概念适用于这两种情况。

x & y    // bitwise AND, 0101 & 0011 = 0001
x | y    // bitwise OR,  0101 | 0011 = 0111

x && y   // true if both x and y are true
x || y   // true if either x or y are true

修改

根据大众的需求,我还应该提一下,这些论点的评估方式不同。在条件版本中,如果整个操作的结果可以由第一个参数确定,则不评估第二个参数。这称为短路评估。按位运算必须评估双方以计算最终值。

例如:

x.foo() && y.bar()

如果y.bar()评估为x.foo(),则只会调用true。相反,

x.foo() || y.bar()
如果y.bar()评估为x.foo()

只会致电false

答案 1 :(得分:33)

(x && y) 

懒惰。如果x为真,它只会评估y。

(x & y)

不是懒惰。 y将永远被评估。

答案 2 :(得分:11)

更新后的答案 - 我的原文具有误导性和不完整性。

首先,我应该就此问题的大部分评论和回答道歉。

在阅读规范之后,按位运算符和条件运算符之间的区别就不那么明确了。

根据14.10 of ECMA-334部分:

  

&,^和|运营商被称为   逻辑运算符。

表示整数运算:

  

1&运算符按位计算   两个操作数的逻辑AND,|   运算符计算按位逻辑   两个操作数的OR,和^   运算符计算按位逻辑   两个操作数的异或。 2号   从这些溢出是可能的   操作

根据14.11:部分

  

&&和||运营商被称为   条件逻辑运算符。 2他们   也被称为“短路”   逻辑运算符。

14.11.1

  

1当&&的操作数时或||是的   键入bool,或者当操作数是   没有定义适用的类型   运营商&或者运营商|,但是   将隐式转换定义为bool,   操作处理如下:   2操作x&& y被评估为   X ? y:假。换句话说,x是   首先评估并转换为类型   布尔。 4然后,如果x为真,则y为   评估并转换为bool类型,   这成为了结果   操作。 5否则,结果   操作是错误的。 6   操作x || y被评估为x?   是的:是的。 7换句话说,x是第一个   评估并转换为bool类型。   8然后,如果x为真,则结果为   操作是真的。 9否则,y   被评估并转换为类型   布尔,这成为了结果   操作。

14.11.2

  

1当&&的操作数时或||是的   声明适用的类型   用户定义的运算符&或运算符|,   必须满足以下两个条件,   其中T是其中的类型   声明了选定的运算符:2   返回类型和每个类型   所选运算符的参数   必须是T. 3换句话说,   运算符必须计算逻辑AND   或两个操作数的逻辑或   键入T,并且必须返回结果   类型T. 4 T必须包含声明   运算符true和运算符false。   第2段1编译时错误   如果这些要求中的任何一个发生   不满意。 2否则,&&   或||操作评估   结合用户定义的运算符   true或运算符false   选定的用户定义运算符:3   操作x&& y被评估为   T.false(x)? x:T。&(x,y),其中   T.false(x)是对。的调用   在T中声明的运算符false,和   T.&(x,y)是对...的调用   选定的运营商&amp ;. 4换句话说,   首先评估x和运算符   在结果上调用false   确定x是否肯定是假的。五   然后,如果x肯定是假的,那么   操作的结果是值   以前为x计算过。 6   否则,y被评估,并且   选定的运营商&被调用   先前为x和x计算的值   为y生成的计算值   操作的结果。 7   操作x || y被评估为   T.true(x)? x:T。|(x,y),其中   T.true(x)是一个调用   operator在T中声明为true,和   T. |(x,y)是对的调用   选定的运算符|。 8换句话说,   首先评估x并使operator为true   在结果上调用以确定   如果x绝对是真的。 9然后,如果是x   绝对是真的,结果   操作是先前的值   为x计算。 10否则,y是   评估,并选择运算符|   在之前的值上调用   计算x和计算的值   为了产生结果   操作。第3段1在任何一个中   这些操作,给出的表达方式   by x只评估一次,而且   由y给出的表达式要么不是   评估或评估一次。   第4段1对于一个类型的例子   实现operator true和   运算符false,参见§18.4.2。