为什么最高优先级操作 [ ] 不首先被评估 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++]
首先解析,结果是 100
,i == 2
。
arr[i--]
接下来解析,结果是 150
,i == 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
。
[ ]优先级最高(反正比+高)。但是在下面表达式的 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++]
首先解析,结果是100
,i == 2
。arr[i--]
接下来解析,结果是150
,i == 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
。