日期:2014-05-20  浏览次数:20670 次

关于System.out.println(a[(a=b)[0]]); 的输出问题
public   class   caozi   {
public   static   void   main(String[]   args)  
{
int   a[]   =   {11,12,13,14,15};
int   b[]   =   {1,2,3,4,5};
System.out.println(a[(a=b)[0]]);
System.out.println(a[(a=b)[0]]);
}
}
结果输出什么?

------解决方案--------------------
下面是使用 javap -c Test 输出的第一个 System.out.println 的虚拟机指令。

a 变量为 1 号,b 变量为 2 号。

26: getstatic    #2; //Field java/lang/System.out:Ljava/io/PrintStream;
29: aload_1  // 从变量中将 a 的数据读入
30: aload_2  // 从变量中将 b 的数据读入
31: dup    // 从栈顶将 2(也就是 b 数据) 取出
32: astore_1  // 将 b 的数据存入到变量 1(也就是 a) 中,注意,a 中的值在第 29 行已经读入内存了
33: iconst_0  // 将常数 0 压入栈中
34: iaload   // 从数组(也就是从 aload_2 中获得值)中装载 0
35: iaload   // 再从数组(也就是从 aload_1 的值)中装载上一行取出的值
36: invokevirtual  #3; //Method java/io/PrintStream.println:(I)V

不知道我说清楚了没有,也就是说在运算完之前,a 的值已经被加载到内存中去了,它的值再怎么变也不会影响到内存中已经读出的值。