有没有时间&& (AndAlso)无关紧要& (和)

时间:2008-11-13 04:24:25

标签: c# boolean-logic

如果我正在评估两个变量而不是两个方法调用,那么天气问题我使用“&&”或“&”

//some logic that sets bool values

boolean X = true;
boolean Y = true;

if (X & Y){
   // perform some operation
}

if (X && Y){
   // perform some operation
}

我在C#3.0 / .NET 3.5中使用的另一本书仅提及&&运营商,是&操作员走开?

4 个答案:

答案 0 :(得分:9)

始终使用&&如果您正在执行真/假逻辑测试。单身&执行一点'和'。在某些情况下,它会像逻辑测试一样工作,但不能保证适用于所有逻辑案例。最常见的使用单一&是在应用位掩码时。

示例(&&):

true && true == true

示例(&):

00101001 & 00100001 = 00100001

答案 1 :(得分:7)

如果您使用单一& (并且)评估表达式的第二部分。如果第二部分依赖于第一部分是真的,这可能是不好的。通常总是使用&&如果第一部分是假的,则不评估第二部分。

逻辑上单身&像其他人所说的那样进行按位操作,这对于布尔比较/评估仍然有效。真的是唯一一次单身&如果第二次评估应该始终运行(如果它是函数调用/修饰符),则应使用(或|)(或布尔评估)。这是不好的做法,也可能是为什么这本书没有提到它。

单身&对标志枚举和位掩码很有用。

以下将抛出obj为null的异常:

bool b = obj != null & obj.IsActive

但这会奏效:

bool b = obj != null && obj.IsActive

这很糟糕:

bool b = obj.IsActive && obj.SetActive(false);
bool b = obj.IsActive & obj.SetActive(false);

&运营商将留在这里。

答案 2 :(得分:3)

正如所观察到的,&是按位AND运算符。随着时间的推移,原始二进制数学看起来越来越不常见,越来越多的开发人员并不真正理解按位算术。这有时可能是一种痛苦。

然而,有很多任务最好用这样解决,尤其是将数据看作标志的任何事情。 &运算符是100%必需的,并且不会去任何地方 - 它的使用频率不如布尔短路&&运算符。

例如:

[Flags]
enum SomeEnum { // formatted for space...
    None = 0, Foo = 1, Bar = 2 // 4, 8, 16, 32, ...
}
static void Main() {
    SomeEnum value = GetFlags();
    bool hasFoo = (value & SomeEnum.Foo) != 0;
}
static SomeEnum GetFlags() { ... }

答案 3 :(得分:1)

&安培;是一个按位运算符而&&是AND运算符。两个完全不同的操作。

int a = 1;
int b = 2;
assert (a & b == 0) 
assert (a && b == true) 

编辑:哎呀......这个例子在C#中不起作用。它应该在C ++中。希望它能说明两个运营商之间的意图和差异。