c++ 执行&=和|= bool短路的运算符?

dgjrabp2  于 2022-12-20  发布在  其他
关注(0)|答案(6)|浏览(175)

在C++中编写这样的代码时:

bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();

如果check_foo()返回false,则不计算check_bar()。这称为short-circuiting or short-circuit evaluation,是惰性计算原则的一部分。
这是否适用于复合赋值运算符&=

bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
  • 对于逻辑OR,请将所有&替换为|,将true替换为false。*
dfuffjeb

dfuffjeb1#

从C++11 5.17 Assignment and compound assignment operators
形式为E1 op = E2的表达式的行为等效于E1 = E1 op E2,只是E1只计算一次。
然而,您混淆了逻辑AND(它 * 会 * 短路)和位AND(它永远不会短路)。
文本片段&&=,也就是你所询问的内容,在标准中找不到,原因是它实际上并不存在:不存在逻辑与赋值运算符。

dvtswwa3

dvtswwa32#

短路(即延迟)计算仅适用于逻辑&&||。按位&|计算两个参数。

mitkmikd

mitkmikd3#

不,它们不会缩短。
请注意,&=|=运算符的形式为& + =| + =位运算符&|不执行快捷方式求值。
只有布尔运算符&&||执行此操作。
这意味着,一个快捷操作符必须被传统地命名为&&=||=。一些语言提供了它们,而C/C++没有。

0x6upsns

0x6upsns4#

代码allTrue &= check_foo();等效于allTrue = allTrue & check_foo(),其中您使用bitwise AND并且不执行延迟求值。
bitwise AND必须接受两个长度相同的二进制表示形式的参数,并使用logical AND运算来比较每个对应的位对。

d6kp6zgx

d6kp6zgx5#

首先:a &= b;a = a && b;不一样,a &= b;意味着a = a & b;,在C/C中没有a &&= b;
逻辑AND a && b有点像1位测试。如果第一个“位”已经是0,那么无论第二个“位”是什么,结果都将始终是0。因此,如果a的结果已经清除,则不必计算b。C/C
标准允许这种优化。
按位AND a & bab的所有位执行此测试。因此,如果a中至少有一个位为非零,则需要计算b。您可能希望如果a==0,则不计算b,但C/C++中不允许此优化。

wvmv3b1j

wvmv3b1j6#

由于&是位操作,因此check_foo()'的计算将与result的值无关

result = false;
result &= check_foo(); // check_foo() is needless called

但是,如果使用&&并且resultfalse,则不会调用check_foo(),如下所示:

result = false;
result = result && check_foo(); // check_foo() is not called, the bitwise operator shortcircuits

相关问题