我(仍在)学习C# - 我认为我理解&
& &&
以及|
& ||
...
然而,在阅读了另一本指南之后,很明显我没有得到它。
我写了一个小小的真值表,正如我想的那样,他们也回归了。从我所看到的,使用双符号听起来像一个优秀的解决方案,但我有点困惑的差异,并想知道是否有人可以请解释/举例为什么/何时你会使用一个而不是另一个 - 我试过阅读MSDN示例,但它让我比开始时更加困惑!
(而且,如果有人能想出一个更好的头衔,请随时改变它......写一个非常尴尬!)
答案 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运算符是逻辑运算符。它会将每一侧视为布尔值,并返回一个布尔值,告诉您有关这些值(操作数)的信息。
单个运算符是按位运算符。它获取每个值中的所有位,对这些位执行布尔逻辑,并将结果位组合成新值。
因为布尔值只包含一个位,所以当使用单个(按位)或双(逻辑)运算符时,布尔操作数的结果是相同的,但由于您(可能)正在执行某些逻辑运算,因此使用它是合乎逻辑的逻辑运算符也是。 (没有双关语)