Java 为什么最高优先级操作[]不首先计算ini=i+;arr[i+;+;]+;arr[i+;+;]?

Java 为什么最高优先级操作[]不首先计算ini=i+;arr[i+;+;]+;arr[i+;+;]?,java,language-lawyer,operator-precedence,Java,Language Lawyer,Operator Precedence,[]优先级最高(无论如何高于+)。但在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 坦白说,这正是我所期望的。运算符优先级似

[]优先级最高(无论如何高于+)。但在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);
下面是发生的情况

  • +
    从右向左关联,但其优先级低于
    []
    ,因此尚未调用它
  • arr[i++]
    首先解析,结果是
    100
    ,其中
    i==2
  • arr[i--]
    下一步解析,结果为
    150
    ,其中
    i==1
  • +
    从左到右解析下一步,并添加
    150+100+1
  • 然后,答案变为251
因此,要回答您的问题……是的,首先进行阵列访问。

请参阅jls:

Java编程语言保证 运算符(条件运算符&&、| |和?:)除外)显示为 在完成操作的任何部分之前,必须对其进行全面评估 表演

二元运算符的左操作数似乎完全相同 在计算右操作数的任何部分之前进行计算


i++

之前,最左边的操作数被计算为
1
,我会非常小心用这种方式编写的代码。为什么要编写这样不可读的代码?检查你的假设。JVM知道它在做什么。您如何知道操作是按特定顺序完成的?让我们看看数组的内容和
i
的最终值。我希望这个认证问题的答案是
z)永远不要这样做。
@inqi777不,那不是你的问题。您的问题是为什么不首先计算
[]
。请参阅我添加到文章中的示例…对于您的示例,输出为1。我不知道你是怎么搞的。。。