考虑
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]
为零。
答案 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;