50,545
社区成员
发帖
与我相关
我的任务
分享
public class Demo {
public static void main(String[] args) {
int a = 8;
a = a + (a=a-(a+10));
System.out.println(a);
}
}
使用javap -c命令反编译,得到下面的结果
public class com.sky.lucene.first.Demo {
public com.sky.lucene.first.Demo();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: bipush 8 //bipush x 将单字节x∈[-128,127]转换为Integer (4字节)入栈,
2: istore_1 // 从栈顶pop(弹栈)出值这里就是8存储到第1个本地变量中,即a
3: iload_1 // 将第一个本地变量入栈,即是a的值入栈
4: iload_1 // 将第一个本地变量入栈,即是a的值入栈
5: iload_1 // 将第一个本地变量入栈,即是a的值入栈,此时栈内已经有三个变量了,值都是8,从栈顶到栈底上到下编个号3,2,1
6: bipush 10 // 如同第一步操作将10入栈,10是栈顶
8: iadd // 加法运算:运算的时候都是从栈顶弹出2个参数,将结果压入栈顶,10与3号变量做加法,结果为18,此时栈顶为18
9: isub //减法运算与加法运算操作类似,2号变量与18做减法,结果为-10,栈顶为-10
10: dup //复制栈顶元素压入栈顶,此时栈顶为-10,栈顶的下面的值依次为-10,8
11: istore_1 //栈顶弹栈将值赋给第一个本地变量a,栈内还剩下-10,和8
12: iadd //做加法操作,结果为-2
13: istore_1 //弹栈将值赋给第一个本地变量a
14: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
17: iload_1
18: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
21: return
}
可以看到第 3,4,5步操作: iload_1就是将三个a,就是3个8压入栈.
a = a + (a=a-(a+10));
/*
*从左往右数,第二个a,第四个和第五个a的值就是8
*/