Why doesn\'t func3 get executed in the program below? After func1, func2 doesn\'t need to get evaluated but for func3, shouldn\'t it?
if (func1() || func2()
If you want all functions to be executed you can drop the short-cut variants
if (func1() | func2() & func3()) {
http://en.wikipedia.org/wiki/Short-circuit_evaluation
You're using the shortcut-operators || and &&. These operators don't execute the rest of the expression, if the result is already defined. For || that means if the first expression is true and for && if the first expression is false.
If you want to execute all parts of the expression use | and & instead, that is not shortcut.
Java functions are evaluated according to precedence rules
because "&&" is of higher precendence than "||", it is evaluated first because you did not have any brackets to set explicit precedence
so you expression of
(A || B && C)
which is
(T || F && F)
is bracketed as
(T || (F && F))
because of the precedence rules.
Since the compiler understands that if 'A == true' it doesn't need to bother evaluating the rest of the expression, it stops after evaluating A.
If you had bracketed ((A || B) && C)
Then it would evaluate to false.
EDIT
Another way, as mentioned by other posters is to use "|" and "&" instead of "||" and "&&" because that stops the expression from shortcutting. However, because of the precedence rules, the end result will still be the same.
Java short-circuits boolean expressions. That means that, once func1()
is executed and returns true
, the rest of that boolean doesn't matter since you are using an or
operator. No matter what func2() && func3()
evaluates to, the whole expression will evaluate to true
. Thus, Java doesn't even bother evaluating the func2()
or func3()
.
You're using a short-circuited or. If the first argument is true, the entire expression is true.
It might help if I add the implicit parentheses that the compiler uses
Edit: As Chris Jester-Young noted, this is actually because logical operators have to left-to-right associativity:
if (func1() || (func2() && func3()))
After func1 returns, it becomes this:
if (true || (func2() && func3()))
After evaluating the short-circuited or, it becomes:
if (true)