I have a simple Java expression depicted below. Based on Operator Precedence table, I expect that this expression would return division by zero exception (since post-fix increment operator has highest priority) and expect that resulting expression would look like:
2 + 2 + 5 / 0
But result is 7, why ? (By little bit of experimentation I found that all operators are assigned value of 1 for some reason, but this does not make sense to me in case priority table is correct)
int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7
The operator precedence does not control the evaluation order. It controls only how the expression is to be read. For example, since multiplication has a higher precedence than addition, x + y * z
is read as x + (y * z)
, not (x + y) * z
. However, it does not change that first x
is evaluated, then y
and finally z
.
Giving a good example with ++
and --
is more difficult, because there is usually only one reading which makes sense. However, you might notice that y - x++
compiles without error (if x
and y
are numerical variables). If ++
would have had a lower precedence than -
it would be evaluated as (x - y)++
which would not compile.
Because of operator precedence, your expression is evaluated as:
(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));
but the evaluation order is not changed by it.