在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
。*
6条答案
按热度按时间dfuffjeb1#
从C++11
5.17 Assignment and compound assignment operators
:形式为E1 op = E2的表达式的行为等效于E1 = E1 op E2,只是E1只计算一次。
然而,您混淆了逻辑AND(它 * 会 * 短路)和位AND(它永远不会短路)。
文本片段
&&=
,也就是你所询问的内容,在标准中找不到,原因是它实际上并不存在:不存在逻辑与赋值运算符。dvtswwa32#
短路(即延迟)计算仅适用于逻辑
&&
和||
。按位&
和|
计算两个参数。mitkmikd3#
不,它们不会缩短。
请注意,
&=
和|=
运算符的形式为&
+=
和|
+=
。位运算符&
和|
不执行快捷方式求值。只有布尔运算符
&&
和||
执行此操作。这意味着,一个快捷操作符必须被传统地命名为
&&=
和||=
。一些语言提供了它们,而C/C++没有。0x6upsns4#
代码
allTrue &= check_foo();
等效于allTrue = allTrue & check_foo()
,其中您使用bitwise AND
并且不执行延迟求值。bitwise AND
必须接受两个长度相同的二进制表示形式的参数,并使用logical AND
运算来比较每个对应的位对。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 & b
对a
和b
的所有位执行此测试。因此,如果a
中至少有一个位为非零,则需要计算b
。您可能希望如果a==0
,则不计算b
,但C/C++中不允许此优化。wvmv3b1j6#
由于&是位操作,因此check_foo()'的计算将与result的值无关
但是,如果使用
&&
并且result
为false
,则不会调用check_foo()
,如下所示: