读书人

关于System.out.println(a[(a=b)[0]])

发布时间: 2012-01-07 21:41:55 作者: rapoo

关于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 的值已经被加载到内存中去了,它的值再怎么变也不会影响到内存中已经读出的值。

读书人网 >J2SE开发

热点推荐