一个简单的例子
public class Test{
public static void main(String[] args){
int i = 0;
int j = 1;
int k = 2;
i = i++;
j = ++j;
k += 2;
}
}
输出结果我们知道是
0
2
4
使用javap命令反编译一下
分析一下得到的输出结果
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: iconst_1
3: istore_2
4: iconst_2
5: istore_3
6: iload_1
7: iinc 1, 1
10: istore_1
11: iinc 2, 1
14: iload_2
15: istore_2
16: iinc 3, 2
19: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
22: iload_1
23: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
26: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
29: iload_2
30: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
33: getstatic #2 // Field java/lang/System.out:Ljava/io/PrintStream;
36: iload_3
37: invokevirtual #3 // Method java/io/PrintStream.println:(I)V
40: return
}
前面6条指令分别给i,j,k变量进行赋值,即
0: iconst_0—–把常量0入栈
1: istore_1——把栈顶元素(0)存入第一个变量i中
2: iconst_1—–把常量1入栈
3: istore_2—–把栈顶元素(1)存入第二个变量j中
4:iconst_2—–把常量2入栈
5: istore_3—–把栈顶元素(2)存入第三个变量k中
接下来的
6,7,10对应的代码是i = i++;
6: iload_1——把第一个变量的值压入栈
7:iinc 1, 1——第一个变量的值加1
10: istore_1——把栈顶元素存入第一个变量i
我们可以知道这里的操作类似于
int temp = i;
i = i+1;
i = temp;
因此i的值并没有发生变化
11,14,15对应的是j = ++j;
11: iinc 2, 1—–把第二个变量j的值加1
14: iload_2—-把第二个变量是j的值压入栈
15: istore_2—-把栈顶元素存入第二个变量j中
操作类似于
i = i+1;
int temp = i;
i = temp;
j的值是发生了改变的
16对应的就是k += 2;
16: iinc 3, 2—把第三变量的值加二
因此k的值是4