i = i++ 在java字節碼層面的分析

有這麼一段代碼: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這條指令實際上是廢指令,執行後又被覆蓋。

相關文章
相關標籤/搜索