运算顺序对增量运算符的影响
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
中,a
在 b
之前计算,而在 x*y
中,x
在 y
之前计算。
您有一个 p + (q * r)
形式的表达式。根据上述规则,p
必须在 (q * r)
之前计算。并且在计算 q * r
时,q
必须在 r
之前计算。所以必须计算p
,然后是q
,然后是r
。
(请注意,此行为不同于 C 和 C++)
让我们看下面的代码:
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
中,a
在 b
之前计算,而在 x*y
中,x
在 y
之前计算。
您有一个 p + (q * r)
形式的表达式。根据上述规则,p
必须在 (q * r)
之前计算。并且在计算 q * r
时,q
必须在 r
之前计算。所以必须计算p
,然后是q
,然后是r
。
(请注意,此行为不同于 C 和 C++)