0

我今天遇到了一些检查许多错误条件的代码。从头到尾都使用了一个布尔值,但不是每次都用 a 重新分配它,而是用 a 重新分配它=&=结果是布尔值的前一个值和新值进行了位明智的与运算。代码看起来像这样:

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

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

  1. FirstCheck 失败(返回 false)并且程序在断言上失败并且永远不会进入 SecondCheck
  2. FirstCheck 通过(返回 true),程序进入 SecondCheck。如果 SecondCheck 返回 true,则结果为 true,因为 true&true = true。如果 SecondCheck 返回 false,则结果为 false,因为 true&false = false。

由于没有逻辑上的差异,是否还有其他原因&=可能更可取?还是更有可能是一些从未改变过的旧代码的遗物?

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

4

4 回答 4

2

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

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

它可以节省编写这样的代码

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

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

当您可以编写如下代码时:

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

if (true == bCheck) {
}
于 2013-10-09T15:23:34.160 回答
1

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

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

于 2013-10-09T15:14:31.927 回答
1

我猜一开始是这样的:

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

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

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

于 2013-10-09T15:19:42.503 回答
0

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

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

那么 x 将等于 true。

但是,如果你这样做了

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

x 等于假

于 2013-10-09T15:16:39.383 回答