Java中赋值运算符的解释

Java中赋值运算符的解释,java,Java,我有这个,它给出: public class Conversions { public static void main(String[] args) { int index = 3; int[] arr = new int[] { 10, 20, 30, 40}; arr[index] = index = 2; //(1)

我有这个,它给出:

public class Conversions {

        public static void main(String[] args) {

                    int index = 3;
                    int[] arr = new int[] { 10, 20, 30, 40};

                    arr[index] = index = 2; //(1)
                    System.out.println("" + arr[3] + " " + arr[2]);

            }
    }
我希望它能给我带来帮助

2 30 
在(1)处,为什么赋值中的索引值没有更改为2(并保持为3)

Java语言规范(JLS)的定义所隐含的
=
意味着您的表达式可以表示为,因此:

但是,国家:

Java编程语言保证运算符的操作数按特定的求值顺序求值,即从左到右

因此,
arr[index]
index=2
is之前进行评估,即在更新
index
的值之前


显然,您不应该编写依赖于这一事实的代码,因为它依赖于几乎没有读者理解的规则

=

如果左侧操作数是数组访问表达式(§15.13), 可能包含在一对或多对括号中,然后:

  • 首先,计算左侧操作数数组访问表达式的数组引用子表达式。如果此评估完成 突然,则赋值表达式为 同样的理由;左操作数数组的索引子表达式 访问表达式)和右侧操作数不进行求值和 没有分配发生

  • 否则,将计算左侧操作数数组访问表达式的索引子表达式。如果此评估完成 突然,则赋值表达式为 原因相同,并且未计算右侧操作数,并且没有 分配发生

  • 否则,将计算右侧操作数的。如果此计算突然完成,则赋值表达式完成 出于同样的原因突然发生,且未发生分配

  • […](进一步的步骤已说明)

如您所见,索引是在赋值的右侧之前计算的

  • 首先计算数组索引头,以确定分配的适当位置(
    arr[index]
  • 对下列所有运算符的优先级进行求值,并发现它们相等(所有运算符都是赋值,因此具有相同的优先级)
  • 然后根据赋值运算符从右向左的结合性对操作数求值

  • 吹毛求疵:
    arr[index]
    没有计算,因为它甚至不是这里的表达式
    arr
    index
    是@zch:
    arr[index]
    是一个表达式,不是吗?@OliCharlesworth,实际上不在赋值的左侧(在Java中)。这肯定不像是一个表达式。@zch:嗯,有点像。但事实上,你答案中的引语将其描述为一种表达……换句话说,永远不要羞于使用括号。
    40 2
    
               =
        +------+-------+
        |              |
    arr[index]         =
                  +----+----+
                  |         |
                index       2