有這麼一段代碼:java
package zl.test; public class PcodeTest { /** * @param args */ public static void main(String[] args) { int i = 1; i = i++; System.out.println(i); } }
輸出爲 1 ,感受有些意思,咱們來分析下字節碼spa
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)值入棧。code
istore_1 : 將棧頂引用類型值保存到局部變量1中。blog
iload_1 : 從局部變量1中裝載int類型值入棧。get
到這裏完成賦值操做,這時在局部變量表中的局部變量1 爲 int 1 ,棧頂爲爲 int 1io
iinc 1,1 :將整數值constbyte加到indexbyte指定的int類型的局部變量中。class
這時局部變量表中的局部變量1 爲 int 2test
istore_1 : 將棧頂引用類型值保存到局部變量1中。這時候覆蓋了 原來的2,局部變量1又變成了int 1變量
在調用println時,看下第10條指令 , iload_1,他把局部變量1 推入棧頂做爲參數。引用
得出傳給println的參數爲 1。所以最後輸入爲 1
因此咱們能夠看出 iinc這條指令實際上是廢指令,執行後又被覆蓋。