使用数组进行多次赋值的意外输出

时间:2014-03-25 10:44:29

标签: java arrays

考虑

int b = 2;

int[] a = new int[4];

a[a[b]] = a[b] = b = 2;

for (int i = 0; i <= 3; i++)
{
    System.out.println(a[i]);
}

输出

2
0
2
0

我期待a[0]为零。

6 个答案:

答案 0 :(得分:2)

摘自JLS 15.26.1。简单分配操作符=

  

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

     

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

这意味着a[a[b]]评估为a[0],因为它首先被评估。然后我们简单地继续a[0] = a[b] = b = 2,任务从右到左进行。

请参阅http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.26.1

答案 1 :(得分:1)

因为a[a[b]]a[0]相同,而您为此分配值为2.

b = 2, a[b] = 0 so a[a[b]] = 2

答案 2 :(得分:1)

a[a[b]] = a[b]=b=2,这是从左侧执行

第一

a[a[b]] i.e, a[a[2]] -> a[0] //initially the value of a[2] will be 0

现在,

a[0]=a[2]=b=2;

所以输出是,

2 0 2 0

答案 3 :(得分:1)

我想这个帖子可能会帮助你理解java中的评估顺序: What are the rules for evaluation order in Java?

此问题最重要的部分是第一个=是实际的分配。在java中,索引总是被评估为asignment,因此a[a[b]]是评估顺序中的第一个。此时a[b]0

答案 4 :(得分:0)

让我们看看a[a[b]] = a[b]=b=2;详细说明了什么:

a[a[b]]:b为2,a[2]为0,a[a[2]]a[0]

因此a[a[b]] = a[b]=b=2;评估为a[0] = a[b]=b=2;

评估为a[0] = a[2] =2;,因此a[2]为2,a[0]等于a[2]

答案 5 :(得分:0)

我想你正在读书

a [a [b]] = a [b] = b = 2;

从右到左并期望在每一步重新评估数组和b,实际上在分配时似乎a和b被冻结了。考虑等效代码:

1) int b = 2;          

//array initialized to 0
2) int[] a= new int[4]; // 0 0 0 0   

// at this point a[b] is a[2] = 0, therefore  below a[a[b]]=2 is equivalent to  a[0]=2
3) a[a[b]] = 2          // 2 0 0 0    

// the same: a[b] = 2 is equivalent to a[2] = 2  -note that the arrays are zero based
4) a[b]= 2              // 2 0 2 0

5) b=2;