是否有理由在布尔值上使用& =而不是just =?

时间:2013-10-09 15:09:34

标签: c# boolean-logic

我今天跑了一些代码,检查了一些错误情况。一直使用单个布尔值,但不是每次使用=重新分配它,而是使用&=重新分配它,导致对布尔值的前一个值进行逐位AND运算,新的价值。代码看起来像这样:

bool result = FirstCheck();
Assert(result);
result &= SecondCheck();
Assert(result);
...

现在我很好奇为什么有人会这样做?这在逻辑上等同于仅重新分配布尔值,如下面可能的分支所示:

  1. FirstCheck失败(返回false)并且程序在断言时失败并且从未进入SecondCheck
  2. FirstCheck传递(返回true),程序进入SecondCheck。如果SecondCheck返回true,则result为true,因为true& true = true。如果SecondCheck返回false,则结果为false,因为true& false = false。
  3. 由于没有逻辑差异,是否还有其他原因&=可能更合适?或者它是否更可能是一些永远不会改变的旧代码的遗物?

    编辑: 为了澄清,Assert始终是活动代码。我实际上在调查一个错误时偶然发现了这个代码,因为断言失败了。

4 个答案:

答案 0 :(得分:2)

是的,原因是您使用单个bool来累积多个函数的返回码。

如果没有& =你用每次调用的最新函数覆盖返回代码,那么你只测试最后一个函数是否成功。使用& =如果单个函数返回false,则返回代码从该点开始保持为false,因此您知道至少有一个函数失败。

它保存了像这样的编写代码

bFirstCheck == fn1();
bSecondCheck == fn2();
bThirdCheck == fn3();

if (bFirstCheck && bSecondCheck && bThirdCheck) {
}

何时可以编写如下代码:

bCheck = fn1();
bCheck &= fn2();
bCheck &= fn3();

if (true == bCheck) {
}

答案 1 :(得分:1)

您假设断言已启用。如果这是使用Debug.Assert,则只有在定义DEBUG条件编译符号时才会实际调用该方法。

假设result稍后使用(超出断言),那么当FirstCheck()返回false时会有所不同。

答案 2 :(得分:1)

我想这一开始就是:

bool result = FirstCheck();
result &= SecondCheck();
Assert(result);

所以代码检查两个结果都是正数,但是有人在firstCheck()之后添加了Assert()。

或者这个人可能来自C ++背景,并认为按位运算符比逻辑运算符更快。

答案 3 :(得分:0)

与其他人说的一样,Assert可能并不总是活跃的代码。然后我们假设第一次和第三次检查返回true,第二次检查返回false。因此,如果你有

x = FirstCheck()
x = SecondCheck()
x = ThirdCheck()

然后x等于真。

但是,如果你做了

x &= FirstCheck()
x &= SecondCheck()
x &= ThirdCheck()

x等于假