C ++短路布尔值

时间:2009-11-25 18:39:29

标签: c++ short-circuiting

我是c ++的新手,很好奇编译器如何处理对布尔值的懒惰评估。例如,

if(A == 1 || B == 2){...}

如果A等于1,那么B == 2部分是否曾被评估过?

8 个答案:

答案 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

几个快速笔记

  • 对重载的&&||运营商进行短期评估将不适用
  • 在C ++中,您保证首先评估第一个表达式。有些语言不保证评估顺序,VB根本不进行短路评估。了解您是否正在移植代码非常重要。

答案 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 evaluationLazy evaluation完全不同。

答案 6 :(得分:0)

不,不是。

&&相同,如果错误,则不会考虑另一个。

答案 7 :(得分:0)

B == 2永远不会被评估。

有关详细信息,请参阅Short-Circuit Evaluation