关于c#:急切操作和短路操作之间的区别?

Difference between eager operation and short-circuit operation? (| versus || and & versus &&)

我(仍然)在学习C-我认为我理解&&&&|&||之间的区别…

不过,在读了另一本指南之后,我显然不明白。

我写了一个小的真理表,正如我所想的,他们也回来了。从我读到的内容来看,使用双符号听起来是一个很好的解决方案,但是我对两者的区别有点困惑,我想知道是否有人可以解释/给出一个示例为什么/什么时候你会使用一个而不是另一个-我试着阅读了msdn示例,但它让我比刚开始的时候更困惑!

enter image description here

(而且,如果有人能想出一个更好的标题,请随意更改它…写一篇很难!)


&;可以用两种不同的方式使用:按位"和"以及逻辑"和"

逻辑表达式和逻辑表达式之间的区别只是,在使用&;的情况下,即使第一个表达式已经是假的,也会对第二个表达式进行计算。如果要初始化循环中的两个变量,这可能(例如)很有趣:

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

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

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

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

对于和相同:如果使用,则始终对两个表达式进行计算,如果使用则可能仅对第一个表达式进行计算,如果第一个表达式为真,则情况也会如此。

相比之下,在其他应用程序中可能是更好的选择。如果mynumber是int?类型,您可以有

1
if (myNumber != null && myNumber.Value == 7)

一开始只计算myNumber != null,如果空检查正常,只计算第二个表达式。

1
if (myNumber != null & myNumber.Value == 7)

如果myNumber为空,则在第二个表达式的计算期间将以nullPointerException结束。因此,您将在此上下文中使用。


你应该阅读这个短路评估。


&与布尔值一起使用。使用这些时,您的输出是有意义的。

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

1
2
3
110010010 |
001000100 =
111010110

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


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

例如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
bool Foo() {
    return false;
}

bool Bar() {
     return true;
}

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

// versus

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

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

在我看来,这是C小组做出的最糟糕的决定之一。这会导致混乱,偶尔会出现细微的错误。


按位运算用于整数。必须将整个整数视为32个单独的位。大多数.NET开发人员很少使用位操作。查看维基百科,了解更多信息。


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

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

1
2
3
4
  1011
& 0010
______
  0010

哪一个是2。

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

例如,当我执行(false expression) && (true expression)时,不会计算真表达式。以东十一〔一〕也是如此。这被称为短路评估


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

1 & 2 = 3

1 && 2 = Error // Not 'true' as I wrote before. It would be in C++, but not in C#.

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

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

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