[英]C++ short-circuiting of booleans
我是C ++的新手,并且很好奇编译器如何处理布尔值的惰性计算。 例如,
if(A == 1 || B == 2){...}
如果A等于1,是否曾经评估过B == 2部分?
不,不评估B==2
部分。 这称为短路评估 。
编辑:正如Robert C. Cartaino正确指出的那样 ,如果逻辑运算符超载,则不会进行短路评估(话虽如此,为什么有人会使逻辑运算符超载不在我的范围内)。
除非||
运算符已重载 ,将不对第二个表达式求值。 这称为“短路评估”。
在逻辑AND(&&)和逻辑OR(||)的情况下,如果第一个表达式足以确定整个表达式的值,则不会对第二个表达式求值。
在上述情况下:
if(A == 1 || B == 2) {...}
...第二个表达式将不被评估,因为
TRUE || ANYTHING
TRUE || ANYTHING
,始终求值为TRUE
。
同样
FALSE && ANYTHING
始终评估为FALSE
,因此这种情况也会引起短路评估 。
&&
和||
操作员。 B == 2部分未评估。
小心! 不要在那边放++ B == 2之类的东西!
C ++对布尔表达式求值应用了短路 ,因此,永远不会求值B == 2
,并且编译器甚至可能完全忽略它。
编译器通过生成中间跳转来处理此问题。 对于以下代码:
if(A == 1 || B == 2){...}
编译为伪汇编器,可能是:
load variable A
compare to constant 1
if equal, jump to L1
load variable B
compare to constant 2
if not equal, jump to L2
L1:
... (complete body of if statement)
L2:
(code after if block goes here)
不,这不对。
与&&
相同,如果其中一个错误,则不必理会另一个。
B == 2
永远不会评估。
有关更多信息,请参见短路评估 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.