我今天跑了一些代码,检查了一些错误情况。一直使用单个布尔值,但不是每次使用=
重新分配它,而是使用&=
重新分配它,导致对布尔值的前一个值进行逐位AND运算,新的价值。代码看起来像这样:
bool result = FirstCheck();
Assert(result);
result &= SecondCheck();
Assert(result);
...
现在我很好奇为什么有人会这样做?这在逻辑上等同于仅重新分配布尔值,如下面可能的分支所示:
由于没有逻辑差异,是否还有其他原因&=
可能更合适?或者它是否更可能是一些永远不会改变的旧代码的遗物?
编辑: 为了澄清,Assert始终是活动代码。我实际上在调查一个错误时偶然发现了这个代码,因为断言失败了。
答案 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等于假