一个简单的例子
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
