Difference between eager operation and short-circuit operation? (| versus || and & versus &&)
我(仍然)在学习C-我认为我理解
不过,在读了另一本指南之后,我显然不明白。
我写了一个小的真理表,正如我所想的,他们也回来了。从我读到的内容来看,使用双符号听起来是一个很好的解决方案,但是我对两者的区别有点困惑,我想知道是否有人可以解释/给出一个示例为什么/什么时候你会使用一个而不是另一个-我试着阅读了msdn示例,但它让我比刚开始的时候更困惑!
(而且,如果有人能想出一个更好的标题,请随意更改它…写一篇很难!)
&;可以用两种不同的方式使用:按位"和"以及逻辑"和"
逻辑表达式和逻辑表达式之间的区别只是,在使用&;的情况下,即使第一个表达式已经是假的,也会对第二个表达式进行计算。如果要初始化循环中的两个变量,这可能(例如)很有趣:
1 | if ((first = (i == 7)) & (second = (j == 10))) { //do something } |
如果使用此语法,如果使用
1 | if ((first = (i == 7)) && (second = (j == 10))) { //do something } |
可能只有第一个在评估之后才有值。
对于和相同:如果使用,则始终对两个表达式进行计算,如果使用则可能仅对第一个表达式进行计算,如果第一个表达式为真,则情况也会如此。
相比之下,在其他应用程序中可能是更好的选择。如果mynumber是
1 | if (myNumber != null && myNumber.Value == 7) |
一开始只计算
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。
在如何执行这两种类型的运算符时,还有一个额外的考虑。使用位运算符时,首先执行运算符两侧的表达式,然后执行该操作。但是,当使用逻辑运算符时,首先执行运算符左侧的表达式,如果不更改结果,则可以忽略右侧的表达式。
例如,当我执行
使用布尔值时没有区别。这种差异在写作时变得更加明显。
1 & 2 = 3
1 && 2 = Error // Not 'true' as I wrote before. It would be in C++, but not in C#.
双运算符是逻辑运算符。它将把每一面都视为布尔值,并返回一个布尔值,告诉您有关这些值(操作数)的一些信息。
单个运算符是位运算符。它获取每个值中的所有位,对这些位执行布尔逻辑,并将结果位组合成新的值。
因为布尔值只包含一个位,所以在使用单(位)或双(逻辑)运算符时,布尔操作数的结果是相同的,但由于您正在(可能)执行某些逻辑操作,所以使用逻辑运算符也是合乎逻辑的。(没有双关语)