Java中的赋值运算符说明

时间:2013-07-21 23:46:39

标签: 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)
                    System.out.println("" + arr[3] + " " + arr[2]);

            }
    }

我有这个,它给出了:

2 30 

我希望它能给出

40 2

At(1)为什么赋值中的索引值没有变为2(并保持为3)。 ?

3 个答案:

答案 0 :(得分:11)

Java语言规范(JLS)right-associativity隐含的= section 15.26意味着您的表达式可以表示为tree,因此:

           =
    +------+-------+
    |              |
arr[index]         =
              +----+----+
              |         |
            index       2

但是,section 15.7表示:

  

Java编程语言保证运算符的操作数似乎以特定的评估顺序进行评估,即从左到右。

因此,arr[index]index = 2之前评估,即之前更新index的值。


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

答案 1 :(得分:5)

  

Java language Specification: 15.26.1. Simple Assignment Operator =

     

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

     
      
  • 首先,计算左侧操作数数组访问表达式的数组引用子表达式。如果此评估完成   然后突然完成赋值表达式   同样的原因;索引子表达式(左侧操作数数组)   访问表达式)和右侧操作数未被评估和   没有任何转让。

  •   
  • 否则,将评估左侧操作数数组访问表达式的索引子表达式。如果此评估完成   然后突然完成赋值表达式   同样的原因和右手操作数没有评估,没有   分配发生。

  •   
  • 否则,评估右侧操作数。如果此评估突然完成,则赋值表达式完成   突然出于同样的原因而且没有任何转让。

  •   
  • [...](进一步说明了步骤)

  •   

正如您所见,索引在作业的右侧之前进行了评估。

答案 2 :(得分:1)

  1. 首先评估数组索引标头,以结束分配的适当位置(arr[index])。
  2. 评估所有后续运算符的优先级,发现它们相等(所有运算符都是赋值,因此具有相同的优先级。)
  3. 根据关联性评估操作数,对于赋值运算符,该关联性是从右到左。