C# 决定将整数运算与布尔运算完全分开。例如,您不能执行 if(x & 4),而必须执行 if((x & 4) != 0) 才能显式地从整数转换为布尔值。
这与 4 多年使用 C 及其前辈的经验一致,在这些经验中,人们经常犯错误,例如 &ing 两个真值为 true 的值并得到 false,因为虽然它们其中两个都是非零,它们没有共同的非零位。
C 和 C++ 都在其历史后期引入了 bool 类型,以在表示数字或位模式的整数与我们只关心真值但必须兼容的值之间添加更明确的区别使用旧代码。 C# 拥有更加明确的奢侈。
考虑到这一点,C# 的 ! 和 ~ 与 C 中的完全相同,只是有些东西不再有意义:
在 C 中,! 否定真值。它将 0(假)变为 1(真),并将所有非零(真)变为 0(假)。在 C# 中,这仅适用于 bool,不适用于 int。
在 C 中 ~ 产生一个补码;它产生一个值,其中每 1 位变为 0,每 0 位变为 1(例如,0xFFFFFFFF 变为 0,0xF0F0F0F0 变为 0x0F0F0F0F 等等)。在 C# 中,int 有意义,但 bool 没有意义。
如果您想在 C# 中执行与 !someInteger 等效的操作,请执行 someInteger == 0。
编辑:
值得注意的是,有时由于运算符被分为“按位”('&'、'|'和'~')和“布尔”('&&'、'||'和' !')。这种区分并不完全正确。
现在,最后三个确实只在布尔上下文中才有意义,因此 C# 对布尔值和整数值进行了更严格的区分,它们不再适用于整数。
'~' 在布尔上下文中确实没有意义('x' 为真的'~x' 将产生一个仍然为真的'x',4294967295 次中有 4294967294 次),因此对于 C#,它不再是应用于布尔值。
'&' 和 '|'保留布尔使用。在 'A()' 和 'B()' 各自返回 bool 的情况下,A() && B() 将仅在 A() 为 false 时调用 B()(即,它“短路”) , A() & B() 在执行 ∧ 布尔运算之前将始终调用这两种方法。这往往很少见,因为:
1234563但是我们无论如何都没有失去任何东西,所以这是习惯。(但请考虑,如果B() 非常便宜,那么无论如何调用它的成本可能比分支机构便宜,特别是如果预测错误,请参阅下面的 cmets)。
有时&& 是强制性的,例如在x != null && x.Length != 0 中,不短路会在第二个参数上引发异常。
-
如果确保调用这两个方法非常重要,那么最好在单独的语句中编写代码,以便让其他开发人员(或稍后回来时您自己)清楚这一点。
但是,如果我们要讨论带有布尔参数和整数参数的运算符之间的区别,我们应该包括 | 和 & 的布尔使用,因为它们确实会出现(有时是通过拼写错误!),并且如果人们错误地将“位运算符”和“布尔运算符”分开并忘记有两个符号同时用作两者,则它们可能会引起混淆。