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 1, is the B==2 part ever evaluated?
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 1, is the B==2 part ever evaluated?
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).
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.
&&
and ||
operators.The B==2 part is not evaluated.
Be careful! Don't put something like ++B==2 over there!
C++ applies short circuiting to Boolean expression evaluation so, the B == 2
is never evaluated and the compiler may even omit it entirely.
B == 2
branch is ever evaluated and if A
is provably a constant expression that is equal to 1
a good compiler will completely omit the branch when instructed to optimize for code size. The code will be compiled but the optimizer is free to strip dead branches if they will never be executed. As for early programmers, it is important to understand basic concepts like what a linker or optimizing compiler does to your code lest you make bad assumptions. –
Veta 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)
This is short-circuit evaluation, as James says. Lazy evaluation is something entirely different.
No it's not.
Same with &&
, if one is wrong, it doesn't bother evaluating the other one.
B == 2
is never evaluated.
See Short-Circuit Evaluation for more information.
© 2022 - 2024 — McMap. All rights reserved.