这个问题在这里已有答案:
[]优先级最高(无论如何高于+)。但是在下面的表达式RHS中,第一个(最左边)的加数(i)在第二个加数arr1 [i ++]之前被计算,因为arr1 [i ++]的i ++不影响第一个(最左边)加数的值(i是1和没有改变)。
我无法严格解释为什么不首先评估更高优先级[]。
int[] arr = { 0, 0, 0 };
int i = 1;
i = i + arr[i++] + arr[i++];
System.out.println(i); // output is zero
见jls Evaluate Operands before Operation:
Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外似乎都要完全评估。
和Evaluate Left-Hand Operand First
在评估右侧操作数的任何部分之前,似乎完全评估了二元运算符的左侧操作数。
在1
之前,最左边的操作数被评估为i++
。
坦率地说,这就像我期望的那样。运算符优先级似乎是正确的。
鉴于此示例代码,我们预计结果不会为负。
int[] arr = {-1000, 100, 150};
int i = 1;
i = i + arr[i++] + arr[i--];
System.out.println(i);
这是发生了什么。
+
从右到左关联,但它的优先级低于[]
,因此尚未调用。arr[i++]
首先解决,并导致100
,与i == 2
。arr[i--]
接下来解决,并导致150
,与i == 1
。+
接下来解决,从左到右,并添加150 + 100 + 1
。所以,回答你的问题......是的,阵列访问首先发生。