有这么一段代码:
package zl.test; public class PcodeTest { /** * @param args */ public static void main(String[] args) { int i = 1; i = i++; System.out.println(i); } }
输出为 1 ,感觉有些意思,我们来分析下字节码
public static void main(java.lang.String[]); Code: Stack=2, Locals=2, Args_size=1 0: iconst_1 1: istore_1 2: iload_1 3: iinc 1, 1 6: istore_1 7: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream; 10: iload_1 11: invokevirtual #22; //Method java/io/PrintStream.println:(I)V 14: return
iconst_1 : 1(int)值入栈。
istore_1 : 将栈顶引用类型值保存到局部变量1中。
iload_1 : 从局部变量1中装载int类型值入栈。
到这里完成赋值操作,这时在局部变量表中的局部变量1 为 int 1 ,栈顶为为 int 1
iinc 1,1 :将整数值constbyte加到indexbyte指定的int类型的局部变量中。
这时局部变量表中的局部变量1 为 int 2
istore_1 : 将栈顶引用类型值保存到局部变量1中。这时候覆盖了 原来的2,局部变量1又变成了int 1
在调用println时,看下第10条指令 , iload_1,他把局部变量1 推入栈顶作为参数。
得出传给println的参数为 1。因此最后输入为 1
所以我们可以看出 iinc这条指令其实是废指令,执行后又被覆盖。