59

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

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

check_bar()check_foo()如果返回将不会被评估false。这称为短路或短路评估,是惰性评估原则的一部分。

这是否适用于复合赋值运算符&=

bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?

对于逻辑用和替换OR所有。&|truefalse

4

6 回答 6

67

从 C++11 开始5.17 Assignment and compound assignment operators

形式为 E1 op = E2 的表达式的行为等价于 E1 = E1 op E2,只是 E1 只计算一次。

但是,您混淆了会短路的逻辑与和永远不会短路的按位与。

文本片段&&=,这将是你将如何做你所要求的,在标准中找不到。原因是它实际上并不存在:没有逻辑和赋值运算符。

于 2014-04-16T10:52:08.050 回答
14

短路(即惰性)评估仅适用于逻辑&&||。按位&计算|两个参数。

于 2014-04-16T10:51:21.997 回答
13

不,他们不会短路。

请注意,&=and|=运算符形成为&+=|+ =位运算符 &并且|不执行快捷方式评估。

只有布尔运算符 &&||执行它。

这意味着,一个快捷操作符在传统上必须被命名为&&=and ||=。一些语言提供它们。C/C++ 没有。

于 2014-04-16T10:54:00.903 回答
4

该代码allTrue &= check_foo();等效于allTrue = allTrue & check_foo() 您正在使用的代码,bitwise AND并且不执行延迟评估。

必须采用二进制表示具有相同长度的bitwise AND两个参数,并使用logical AND操作来比较每个对应的位对。

于 2014-04-16T10:53:17.357 回答
2

第一:a &= b;不一样a = a && b;a &= b;意味着a = a & b;。在 C/C++ 中没有a &&= b;.

逻辑与a && b有点像对 1 位的测试。如果第一个“位”已经为 0,那么无论第二个结果如何,结果都将始终为 0。所以没有必要评估b结果是否已经从a. C/C++ 标准允许这种优化。

按位 AND对和a & b的所有位执行此测试。因此,如果至少有一位非零,则需要评估。您可能希望 if , than不会被评估,但这种优化在 C/C++ 中是不允许的。abbaa==0b

于 2014-04-16T10:57:08.117 回答
0

由于 & 是一个位操作,check_foo() 将首先被评估,而不管 allTrue 的值在

allTrue &= check_foo(); // also for allTrue = allTrue & check_foo();

并且

allTrue &= check_bar(); // also for allTrue = allTrue & check_bar();

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

allTrue = allTrue && check_foo();
于 2014-04-16T10:57:22.083 回答