iFr*_*cht 38 c++ boolean lazy-evaluation short-circuiting compound-assignment
在C++中编写这样的代码时:
bool allTrue = true;
allTrue = allTrue && check_foo();
allTrue = allTrue && check_bar();
Run Code Online (Sandbox Code Playgroud)
check_bar()
如果check_foo()
退回,将不会被评估false
.这称为短路或短路评估,是惰性评估原则的一部分.
这是否适用于复合赋值运算符&=
?
bool allTrue = true;
allTrue &= check_foo();
allTrue &= check_bar(); //what now?
Run Code Online (Sandbox Code Playgroud)
用逻辑OR
替换所有&
with |
和true
with false
.
pax*_*blo 44
从C++ 11开始5.17 Assignment and compound assignment operators
:
形式E1 op = E2的表达式的行为等同于E1 = E1 op E2,除了E1仅被评估一次.
但是,你混淆了逻辑并不会短路,以及按位和从来不会.
标准文件中无处可找到文本片段&&=
,您将如何处理您所要求的内容.原因是它实际上并不存在:没有逻辑和赋值运算符.
不,他们不会做空.
请注意,&=
和|=
运算符形成为&
+ =
和|
+ =
.位运算符 &
和|
不执行快捷评估.
只有布尔运算符 &&
并||
执行它.
这意味着,一个快捷操作符必须传统上命名&&=
和||=
.有些语言提供它们.C/C++没有.
第一:a &= b;
与 不一样a = a && b;
。a &= b;
方法a = a & b;
。在 C/C++ 中没有a &&= b;
.
逻辑 ANDa && b
有点像 1 位的测试。如果第一个“位”已经是 0,那么无论第二个“位”如何,结果都将始终为 0。因此没有必要评估b
结果是否已经清楚a
。C/C++ 标准允许这种优化。
按位 AND对和a & b
的所有位执行此测试。因此需要评估是否至少有一位非零。您可能希望不计算 if , then ,但 C/C++ 中不允许这种优化。a
b
b
a
a==0
b
小智 5
该代码allTrue &= check_foo();
相当于allTrue = allTrue & check_foo()
您正在使用的代码bitwise AND
,并且不执行延迟计算。
必须bitwise AND
采用两个二进制表示具有相同长度的参数,并使用logical AND
操作来比较每个相应的位对。