我们来看下面的代码:
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,因为乘法优先于加法?
换句话说:在包含多个++
的单个语句中 - 对同一个变量进行操作,我保证它们总是从左到右执行吗?
答案 0 :(得分:1)
引用Java Language Specification:
Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。
答案 1 :(得分:1)
在Java中,这是有保证的。
来自Java Language Specification, section 15.7.1:
在评估右侧操作数的任何部分之前,二元运算符的左侧操作数似乎已完全评估。
这意味着在a+b
中,a
在b
之前进行评估,x*y
x
在y
之前进行评估。
您的表达式为p + (q * r)
。根据上述规则,必须在p
之前评估(q * r)
。在评估q * r
时,必须在q
之前评估r
。因此,必须先评估p
,然后q
,然后r
。
(请注意,此行为与C和C ++不同)