Java order of expression evaluation with AND and OR

    boolean a = false;
    boolean b = false;
    boolean c = false;
    boolean bool = (a = true) || (b = true) && (c = true);
    System.out.println("" + a + b + c);

The prceding code prints truefalsefalse. But, the && operator has higher precedence than the || operator and should be evaluated first, so why doesn't it print truetruetrue?

Jon Skeet
people
quotationmark

I believe the crux of your question is this part:

But, the && operator has higher precedence than the || operator and should be evaluated first

No. Precedence doesn't affect execution ordering. It's effectively bracketing. So your expression is equivalent to:

boolean bool = (a = true) || ((b = true) && (c = true));

... which still executes a = true first. At that point, as the result will definitely be true and || is short-circuiting, the right-hand operand of || is not executed, so b and c are false.

From JLS section 15.7.1:

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.

Precedence is not relevant to that.

people

See more on this question at Stackoverflow