我今天碰到了一些代码,它检查了一些错误条件。一直使用一个布尔值,但不是每次用=
重新分配它,而是重新分配&=
,导致布尔值和新值的先前值的位逻辑与。代码看起来像这样:是否有理由在布尔值上使用&=而不是= =?
bool result = FirstCheck();
Assert(result);
result &= SecondCheck();
Assert(result);
...
现在我很好奇为什么有人会这样做?这是逻辑上等同于刚刚重新分配布尔值如由下面的可能的分支:
- FirstCheck失败(返回false)和断言程序失败,并且永远不会使得它SecondCheck
- FirstCheck传递(返回真正的),程序使它成为SecondCheck。如果SecondCheck返回true,则结果为true,因为true & true = true。如果SecondCheck返回false,则结果为false,因为true & false = false。
由于没有逻辑差异,是否还有其他一些原因&=
可能更可取?还是更可能是一些旧代码的遗留物,它们从来没有改变过?
编辑: 为了澄清,Assert始终是活动代码。我在调查一个错误时偶然发现了这段代码,因为断言失败了。
是否在某些位运算符比逻辑一快的情况下? – GBleaney
这*不*执行按位与。当在C#中调用布尔值时,'&'操作符只会执行非短路AND操作。所以它永远不会更快,它可能会更慢。只有在不考虑result的值的情况下执行'SecondCheck'的副作用是非常重要的。要么,要么只是一个错误。 – Servy