急切操作和短路操作之间的区别? (|对||和&对比&&)

时间:2011-01-29 17:08:40

标签: c# .net

我(仍在)学习C# - 我认为我理解&& &&以及|& || ...

然而,在阅读了另一本指南之后,很明显我没有得到它。

我写了一个小小的真值表,正如我想的那样,他们也回归了。从我所看到的,使用双符号听起来像一个优秀的解决方案,但我有点困惑的差异,并想知道是否有人可以请解释/举例为什么/何时你会使用一个而不是另一个 - 我试过阅读MSDN示例,但它让我比开始时更加困惑!

enter image description here

(而且,如果有人能想出一个更好的头衔,请随时改变它......写一个非常尴尬!)

7 个答案:

答案 0 :(得分:7)

&安培;可以以两种不同的方式使用:按位“和”和逻辑“和”

逻辑与...之间的区别和&&仅在您使用&的情况下,即使第一个表达式已经为假,也会评估第二个表达式。如果你想在循环中初始化两个变量,这可能(例如)很有趣:

if ((first = (i == 7)) & (second = (j == 10))) { //do something }

如果您使用此语法,如果您使用

,则第一个和第二个将始终具有值
if ((first = (i == 7)) && (second = (j == 10))) { //do something }

可能只有在评估后才有第一个值。

对于|是相同的和||:如果使用|,如果使用||,则总是计算两个表达式可能只有第一个表达式被评估,如果第一个表达式为真,则可能是这种情况。

相反,在其他应用程序中&&可能是更好的选择。如果myNumber的类型为int?,则可以使用类似

的内容
if (myNumber != null && myNumber.Value == 7)

并且这只会首先评估myNumber != null,如果空检查没问题,它只会评估第二个表达式。

if (myNumber != null & myNumber.Value == 7)
如果myNumber为null,则在评估第二个表达式期间,

将以NullPointerException结束。因此,你会使用&&在这种情况下。

答案 1 :(得分:5)

你应该阅读Short-circuit evaluation

答案 2 :(得分:4)

&安培;&安培;和||用于布尔值。使用这些输出时输出是有意义的。

&安培;和|是按位运算符,意味着它们逐位应用于操作数。例如

110010010 |
001000100 =
111010110

使用程序输出的同一个表但有点时间。它们主要用于整数,而不是布尔值。

答案 3 :(得分:1)

这种差异在布尔人中不太明显;按位运算符主要用于数字,而逻辑运算符主要用于布尔值。在按位操作(例如,&)中,对每个位执行操作。在逻辑运算(例如,&&)中,对整个结果执行操作。

例如,按位& 11(二进制1011)和2(10二进制)将如下计算:

  1011
& 0010
______
  0010

是2.

还有一个额外的考虑因素是如何执行这两种类型的运算符。使用按位运算符时,首先执行运算符两侧的表达式,然后执行运算。但是,在使用逻辑运算符时,首先执行运算符左侧的表达式,如果不改变结果,则可以忽略右侧。

例如,当我执行(false expression) && (true expression)时,永远不会评估true表达式。与(true expression) || (false expression)同样如此。这被称为短路评估

答案 4 :(得分:1)

按位运算用于整数。您必须将整个整数视为32个单独的位。大多数.NET开发人员很少使用按位操作。查看wikipedia以获得更多说明。

答案 5 :(得分:1)

我认为你被绊倒了,因为C#已经超载了|&。与数字基元一起使用时,它们是按位运算。与布尔值一起使用时,它们就像||&&一样,除非它们没有短路。

例如

bool Foo() {
    return false;
}

bool Bar() {
     return true;
}

if(Foo() & Bar()) {
     // do something
}

// versus

if(Foo() && Bar()) {
      // do something 2
}

在上面的例子中,第一个布尔表达式将同时执行Foo()和Bar(),但在第二个布尔表达式中只执行Foo()。

IMO这是C#团队做出的最糟糕的决定之一。这会导致令人困惑,偶尔会出现微妙的错误。

答案 6 :(得分:0)

使用布尔值时没有区别。写作时差异变得更加显着

  

1& 2 = 3

     

1&& 2 =错误//不像我之前写的那样'真'。它将在C ++中,但不在C#中。

double运算符是逻辑运算符。它会将每一侧视为布尔值,并返回一个布尔值,告诉您有关这些值(操作数)的信息。

单个运算符是按位运算符。它获取每个值中的所有位,对这些位执行布尔逻辑,并将结果位组合成新值。

因为布尔值只包含一个位,所以当使用单个(按位)或双(逻辑)运算符时,布尔操作数的结果是相同的,但由于您(可能)正在执行某些逻辑运算,因此使用它是合乎逻辑的逻辑运算符也是。 (没有双关语)