C++ short-circuiting of booleans

前端 未结 8 1971
生来不讨喜
生来不讨喜 2020-11-28 16:05

I\'m new to c++ and am curious how the compiler handles lazy evaluation of booleans. For example,

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

If A does equal

相关标签:
8条回答
  • 2020-11-28 16:13

    B == 2 is never evaluated.

    See Short-Circuit Evaluation for more information.

    0 讨论(0)
  • 2020-11-28 16:23

    This is short-circuit evaluation, as James says. Lazy evaluation is something entirely different.

    0 讨论(0)
  • 2020-11-28 16:29

    No, the B==2 part is not evaluated. This is called short-circuit evaluation.

    Edit: As Robert C. Cartaino rightly points out, if the logical operator is overloaded, short-circuit evaluation does not take place (that having been said, why someone would overload a logical operator is beyond me).

    0 讨论(0)
  • 2020-11-28 16:29

    The compiler handles this by generating intermediate jumps. For the following code:

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

    compiled to pseudo-assembler, might be:

        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)
    
    0 讨论(0)
  • 2020-11-28 16:29

    No it's not.

    Same with &&, if one is wrong, it doesn't bother evaluating the other one.

    0 讨论(0)
  • 2020-11-28 16:34

    Unless the || operator is overloaded, the second expression will not be evaluated. This is called "short-circuit evaluation."

    In the case of logical AND (&&) and logical OR (||), the second expression will not be evaluated if the first expression is sufficient to determine the value of the entire expression.

    In the case you described above:

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

    ...the second expression will not be evaluated because

    TRUE || ANYTHING, always evaluates to TRUE.

    Likewise,

    FALSE && ANYTHING, always evaluates to FALSE, so that condition will also cause a short-circuit evaluation.

    A couple of quick notes

    • Short circuit evaluation will not apply to overloaded && and || operators.
    • In C++, you are guaranteed that the first expression will be evaluated first. Some languages do not guarantee the order of evaluation and VB doesn't do short-circuit evaluation at all. That's important to know if you are porting code.
    0 讨论(0)
提交回复
热议问题