Java post-增量和预增量行为

Java post-increment and pre increment behaviour

我有一个简单的 Java 表达式,如下所示。基于 Operator Precedence table,我希望这个表达式会 return 除以零异常(因为 post-fix 增量运算符具有最高优先级)并期望结果表达式看起来像:

2 + 2 + 5 / 0

但是结果是7,为什么? (通过一些实验,我发现出于某种原因,所有运算符都被赋予了 1 的值,但是如果优先级 table 是正确的,这对我来说没有意义)

int intCountOperator = 0;
unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
System.out.println(unaryOperand); // Prints 7

表达式从左到右求值:

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;
                        1         +          1       + 5 / 1                    = 7

请注意,运算符是按您期望的顺序求值的,即 1 + 1 + (5/1) = 1 + 1 + 5 = 7,但所有这些表达式的操作数都是从左到右求值的。

求值顺序是从左到右,而不是从右到左。所以你得到的结果 7 是正确的。

unaryOperand = ++intCountOperator + intCountOperator + 5 / intCountOperator++;

实际上是

unaryOperand = 1 + 1 + 5 / 1; = 7

运算符优先级不控制计算顺序。它仅控制表达式的读取方式。例如,由于乘法的优先级高于加法,因此 x + y * z 被读作 x + (y * z),而不是 (x + y) * z。但是,首先评估 x,然后评估 y,最后评估 z.

并没有改变

++--给出一个很好的例子比较困难,因为通常只有一种读法是有意义的。但是,您可能会注意到 y - x++ 编译没有错误(如果 xy 是数值变量)。如果 ++ 的优先级低于 -,它将被评估为 (x - y)++,无法编译。

由于运算符优先级,您的表达式被计算为:

(++intCountOperator) + (intCountOperator + (5 / (intCountOperator++)));

但评估顺序并没有被它改变。