急切操作和短路操作之间的区别? (| 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#中。

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

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

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