在Java中将一个数组引用赋值给另一个数组

3
int a[]={1, 2, 3, 4, 5};
int b[]={4, 3, 2, 1, 0};

a=b;

System.out.println("a[0] = "+a[0]);

这段文字的意思是:“这里展示了a[0] = 4,因为a被赋值为b的引用。如果按照以下方式进行修改......”
int a[]={1, 2, 3, 4, 5};
int b[]={4, 3, 2, 1, 0};        

System.out.println("a[(a=b)[0]] = "+a[(a=b)[0]]);  //<-------

然后,它显示 a[(a=b)[0]] = 5
为什么这个表达式 a[(a=b)[0]] 不会产生 4,即数组 b 的第 0 个元素,尽管它看起来与前面的情况相同?

1
数组索引具有最高优先级 - PM 77-1
1个回答

7
第二个表达式包含一个数组索引器表达式内的赋值表达式。该表达式的计算过程如下:
  • 选择索引器表达式的目标。即原始数组 a
  • 首先将b分配给a,然后取b在索引0上的元素来评估索引表达式
  • 外部索引器的索引为b[0]
  • 将索引应用于a,返回5
  • ba的赋值生效。随后访问a[i]将引用b,而不是原始的a

实质上,你的单行表达式等同于以下两行代码:

System.out.println("a[(a=b)[0]] = "+a[b[0]]); // Array reference completes first
a=b;                                       // Array assignment is completed last

最后结果就只是 a[4]。:) - Amith
@dasblinkenlight,但是为什么将b赋值给a的效果只在进程结束时才生效? - AlexR
1
@AlexR,决定表达式a[something]的结果并不取决于赋值实际发生的时间。唯一重要的是选择作为[]表达式第一个操作数的对象是什么。在这个例子中,对象是旧的a,因为赋值在操作数的右侧,所以赋值的效果在表达式的那一点上不可见。 - Sergey Kalinichenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接