我是c ++的新手,很好奇编译器如何处理对布尔值的懒惰评估。例如,
if(A == 1 || B == 2){...}
如果A等于1,那么B == 2部分是否曾被评估过?
答案 0 :(得分:20)
不,B==2
部分未评估。这称为short-circuit evaluation。
编辑:作为Robert C. Cartaino rightly points out,如果逻辑运算符过载,则不会进行短路评估(已经说过,为什么有人会使逻辑运算符超载的原因超出我的意义)。
答案 1 :(得分:17)
除非||
运算符过载,否则不会计算第二个表达式。这称为“短路评估”。
在逻辑AND(&&)和逻辑OR(||)的情况下,如果第一个表达式足以确定整个表达式的值,则不会计算第二个表达式。
如上所述:
if(A == 1 || B == 2) {...}
...第二个表达式不会被评估,因为
TRUE || ANYTHING
,始终评估为TRUE
。
同样,
FALSE && ANYTHING
,始终评估为FALSE
,因此该条件也会导致short-circuit evaluation。
&&
和||
运营商进行短期评估将不适用。答案 2 :(得分:1)
不评估B == 2部分。
小心!不要在那边放上像++ B == 2这样的东西!
答案 3 :(得分:1)
C ++将short circuiting应用于布尔表达式求值,因此永远不会评估B == 2
,编译器甚至可能完全省略它。
答案 4 :(得分:1)
编译器通过生成中间跳转来处理此问题。对于以下代码:
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)
答案 5 :(得分:1)
正如詹姆斯所说,这是short-circuit evaluation。 Lazy evaluation完全不同。
答案 6 :(得分:0)
不,不是。
与&&
相同,如果错误,则不会考虑另一个。
答案 7 :(得分:0)
B == 2
永远不会被评估。
有关详细信息,请参阅Short-Circuit Evaluation。