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]]yield 4,第 0元素,b即使它看起来与前面的情况相同?

4

1 回答 1

7

第二个表达式具有数组索引器表达式内的赋值表达式。表达式计算如下:

  • 选择索引器表达式的目标。这是原始数组a
  • 索引表达式的求值方法是首先将 赋值ba,然后取b索引 0 处的元素
  • 外部索引器的索引被评估为b[0]
  • 索引应用于a,返回5
  • bto的赋值a生效。后续访问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
于 2013-10-13T17:23:50.483 回答