8

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

//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

4 回答 4

9

如果您正在执行真/假逻辑测试,请始终使用 &&。单个 & 执行按位“和”。在某些情况下,它可以像逻辑测试一样工作,但不能保证适用于所有逻辑情况。单个 & 最常见的用途是在应用位掩码时。

例子 (&&):

true && true == true

例子 (&):

00101001 & 00100001 = 00100001
于 2008-11-13T04:29:59.863 回答
7

如果您使用单个 & (And),则计算表达式的第二部分。如果第二部分依赖于第一部分的真实性,这可能会很糟糕。通常总是使用 && 因为如果第一部分为假,则不评估第二部分。

正如其他人所说,从逻辑上讲,单个 & 执行按位运算,这对于布尔比较/评估仍然有效。真正应该使用单个 & (或 |)(或布尔评估)的唯一时间是第二次评估是否应该始终运行(如果它是函数调用/修饰符)。这是一种不好的做法,可能是这本书没有提到它的原因。

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

下面会抛出 obj is 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);

& 运算符将继续存在。

于 2008-11-13T04:35:02.193 回答
3

正如已经观察到的,&是按位与运算符。随着时间的推移,原始二进制数学似乎越来越不常见,越来越多的开发人员并不真正了解按位算术。这有时会很痛苦。

然而,有很多任务最好用这种方式解决,特别是任何将数据视为标志的任务。该&运算符是 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() { ... }
于 2008-11-13T05:16:51.937 回答
1

& 是位运算符,而 && 是 AND 运算符。两种完全不同的操作。

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

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

于 2008-11-13T04:30:04.420 回答