为什么不首先评估最高优先级操作[] ini = i + arr [i ++] + arr [i ++]? [重复]

问题描述 投票:-1回答:2

[]优先级最高(无论如何高于+)。但是在下面的表达式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
java language-lawyer operator-precedence
2个回答
0
投票

见jls Evaluate Operands before Operation

Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&&,||和?:)除外似乎都要完全评估。

Evaluate Left-Hand Operand First

在评估右侧操作数的任何部分之前,似乎完全评估了二元运算符的左侧操作数。

1之前,最左边的操作数被评估为i++


0
投票

坦率地说,这就像我期望的那样。运算符优先级似乎是正确的。

鉴于此示例代码,我们预计结果不会为负。

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
  • 然后答案变成251。

所以,回答你的问题......是的,阵列访问首先发生。

© www.soinside.com 2019 - 2024. All rights reserved.