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

Why highest priority operation [ ] is not evaluated first ini = i + arr[i++] + arr[i++]?

[ ]优先级最高(反正比+高)。但是在下面表达式的 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

坦率地说,这符合我的预期。运算符优先级似乎是正确的。

鉴于此示例代码,我们希望结果不是

int[] arr = {-1000, 100, 150};
int i = 1;
i = i + arr[i++] + arr[i--];
System.out.println(i);

事情是这样的。

  • +关联right-to-left,但是优先级低于[],所以还没有调用
  • arr[i++] 首先解析,结果是 100i == 2
  • arr[i--] 接下来解析,结果是 150i == 1.
  • + 解析下一个,从左到右,并添加 150 + 100 + 1.
  • 答案就变成了251.

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

见 jls Evaluate Operands before Operation:

The Java programming language guarantees that every operand of an operator (except the conditional operators &&, ||, and ? :) appears to be fully evaluated before any part of the operation itself is performed.

Evaluate Left-Hand Operand First

The left-hand operand of a binary operator appears to be fully evaluated before any part of the right-hand operand is evaluated.

最左边的操作数在 i++ 之前计算为 1