急切操作和短路操作之间的区别? (| versu ||和&versu &&)
我(仍在)学习C# – 我认为我理解&&
和|
之间的区别 & ||
…
但是,在阅读了另一本指南之后,很明显我没有得到它。
我写了一个小小的真值表,正如我想的那样,它们会返回相同的。 从我所看到的,使用双符号听起来像一个优秀的解决方案,但我有点困惑的差异,并想知道是否有人可以请解释/举例为什么/何时你会使用一个而不是另一个 – 我试过阅读MSDN示例,但它让我比起初时更加困惑!
(而且,如果有人能想出更好的头衔,请随意改变它……写一个很尴尬!)
&可以以两种不同的方式使用:按位“和”和逻辑“和”
逻辑&和&&之间的区别仅在于您使用&时,即使第一个表达式已经为假,也会对第二个表达式进行求值。 如果你想在循环中初始化两个变量,这可能(例如)很有趣:
if ((first = (i == 7)) & (second = (j == 10))) { //do something }
如果使用此语法,则第一个和第二个将始终具有值(如果使用)
if ((first = (i == 7)) && (second = (j == 10))) { //do something }
可能只有在评估后才有第一个值。
对于|是一样的 和||:如果使用|,如果使用||,则始终计算两个表达式 可能只有第一个表达式被计算,如果第一个表达式为真,则会出现这种情况。
相比之下,在其他应用中,&&可能是更好的选择。 如果myNumber是int?
类型int?
,你可以有类似的东西
if (myNumber != null && myNumber.Value == 7)
这只会首先评估myNumber != null
,如果null检查没问题,它只会评估第二个表达式。
if (myNumber != null & myNumber.Value == 7)
如果myNumber为null,则在评估第二个表达式期间将以NullPointerException结束。 因此,您可以在此上下文中使用&&。
你应该读一下这个短路评估 。
&&和|| 与布尔一起使用。 使用这些时,您的输出是有意义的。
&和| 是按位运算符,意味着它们逐位应用于操作数。 例如
110010010 | 001000100 = 111010110
使用程序输出的同一个表,但有点时间。 它们主要用于整数,而不是布尔值。
布尔值的差异不太明显; 按位运算符主要用于数字,而逻辑运算符主要用于布尔值。 在按位操作(例如,&)中,对每个位执行操作。 在逻辑运算(例如,&&)中,对整个结果执行操作。
例如,按位&的11(二进制1011)和2(二进制10)将如下计算:
1011 & 0010 ______ 0010
这是2。
关于如何执行这两种类型的运算符还有一个额外的考虑因素。 使用按位运算符时,首先执行运算符两侧的表达式,然后执行运算。 但是,在使用逻辑运算符时,首先执行运算符左侧的表达式,如果不改变结果,则可以忽略右侧的表达式。
例如,当我执行(false expression) && (true expression)
,永远不会计算true表达式。 与(true expression) || (false expression)
(true expression) || (false expression)
。 这被称为短路评估
按位运算用于整数。 您必须将整个整数视为32个单独的位。 大多数.NET开发人员很少使用按位操作。 查看维基百科以获得更多说明。
我认为你因为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#团队做出的最糟糕的决定之一。 它会导致混乱和偶尔的微妙错误。
使用布尔值时没有区别。 写作时差异变得更加明显
1&2 = 3
1 && 2 =错误//我之前写的不是’真’。 它将在C ++中,但不在C#中。
双运算符是逻辑运算符。 它会将每一侧视为布尔值,并返回一个布尔值,告诉您有关这些值(操作数)的信息。
单个运算符是按位运算符。 它获取每个值中的所有位,对这些位执行布尔逻辑,并将结果位组合成新值。
因为布尔值只包含一个位,所以当使用单个(按位)或双(逻辑)运算符时,布尔操作数的结果是相同的,但由于您(可能)正在执行某些逻辑运算,因此使用逻辑运算符是合乎逻辑的太。 (没有双关语)