繁体   English   中英

Java中的赋值运算符说明

[英]Assignment operator explanation in 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

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

右结合性=由隐含部分15.26 Java语言规范(JLS)的意味着你的表达式可表示为一个 ,从而:

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

但是, 第15.7节规定:

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

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


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

Java语言规范:15.26.1。 简单的赋值运算符 =

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

  • 首先,评估左侧操作数数组访问表达式的数组引用子表达式。 如果此评估突然完成,则赋值表达式出于同样的原因突然完成; 不评估索引子表达式(左侧操作数数组访问表达式)和右侧操作数,也不进行赋值。

  • 否则,将评估左侧操作数数组访问表达式索引子表达式 如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会评估右侧操作数并且不会进行赋值。

  • 否则,将评估右侧操作数 如果此评估突然完成,则赋值表达式会出于同样的原因突然完成,并且不会发生任何分配。

  • [...](进一步解释)

如您所见,索引在赋值的右侧之前进行了求值。

  1. 首先计算数组索引头,以结束赋值的适当位置( arr[index] )。
  2. 评估所有后续运算符的优先级,并找到相等的(所有运算符都是赋值,因此具有相同的优先级)。
  3. 比操作数是根据关联性来评估的,关联性是赋值运算符的从右到左。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM