Reputation: 25
Assume the following expression:
public class OperatorTest {
public static void main(String[] args) {
int x = 0;
int y = 0;
if(0 == 0 || ++y == 1) {
// Some other logic here
}
System.out.println(y);
}
}
The output is 0. I understand short-circuit operators, in that the right-hand side of || would not execute because the left-hand side evaluates to true. However, ++ takes precedence over short-circuit logical operators, so shouldn't the ++ operator evaluate before the logical operator is evaluated? Note: I probably would not need to do this in the real-world; this is for a certification exam that I'm studying for.
Upvotes: 1
Views: 97
Reputation: 178263
The short-circuiting logical operators don't even evaluate the right side when short-circuiting. This is covered by the JLS, Section 15.24, which covers the ||
operator.
At run time, the left-hand operand expression is evaluated first; if the result has type
Boolean
, it is subjected to unboxing conversion (§5.1.8).If the resulting value is
true
, the value of the conditional-or expression istrue
and the right-hand operand expression is not evaluated.
(bold emphasis mine)
So, the ++y
is never evaluated, and y
remains 0
.
The same short-circuiting behavior exists for the &&
operator when the left side evaluates to false
.
Upvotes: 2
Reputation: 481
The higher precedence operators hold their arguments more closely, as if there were parentheses present. Your code is equivalent to this:
public static void main (String[] args)
{
int x = 0;
int y = 0;
if (0 == 0)
{
// Some other logic here
}
else if (++y == 1)
{
// Some other logic here
}
System.out.println (y);
}
Upvotes: 0