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