运算顺序对增量运算符的影响

Effect of order of operations on increment operator

让我们看下面的代码:

int[] data   = {1, 2, 3};
int   pos    = 0;
int   result = data[pos++] + data[pos++]*data[pos++];

我能否保证我的 result 始终为 1 + 2*3,即 7,或者 Java 编译器或 JVM 是否可以重新排序 data[pos++] 语句的执行,以便例如,我得到 3 + 1*2,即 5,因为乘法优先于加法?

换句话说:在包含对同一变量的多个 ++ 操作的单个语句中,我能保证它们总是从左到右执行吗?

引用 Java Language Specification:

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.

在Java中,这是有保证的。

来自Java Language Specification, 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.

这意味着在 a+b 中,ab 之前计算,而在 x*y 中,xy 之前计算。

您有一个 p + (q * r) 形式的表达式。根据上述规则,p 必须在 (q * r) 之前计算。并且在计算 q * r 时,q 必须在 r 之前计算。所以必须计算p,然后是q,然后是r

(请注意,此行为不同于 C 和 C++)