反編譯 i++ ,++i,i=i+1區別(修改)

1.(i++,++i)和i=i+1最大的區別

i++和++i使用的時iinc進行自增,i=i+1使用的是iadd操作棧頂和次棧頂元素進行相加

iinc操作的時局部變量表中的數據,iadd操作操作數棧中的數據 。有疑問?就先帶着疑問往下看

2.i++和++i的最大區別

i++是先把局部變量表的數據iload到棧頂,然後再進行iinc(操作數棧i=0,局部變量表i=1),++i是先對局部變量表的數據進行iinc再放入操作數棧(操作數棧i=1,局部變量表i=1)。繼續往下看

代碼:

package com.java;

public class Test11 {
public static void main(String[] args) {
    int i=0;
    i=i++;
}
}

反編譯:

0:就是 先將常量0放入棧中
1:將棧頂元素0取出給i
2:   將i的值0推送到棧頂
3:將局部變量表的值進行+1
4:將棧頂元素0賦值給i
因此最終結果 如果打印i 結果是0

 

如果真的向我們說的i=i++就是i=i;i=i+1  會比上邊反編譯多一次存棧和取棧的過程  
代碼:

public class Test11 {
    public static void main(String[] args) {
        int i=0;
        i=i;
        i=i+1;
    }
}

反編譯:

0:將常量0放入棧頂
1:將棧頂0取出給變量i
2:將變量i的值0放入棧頂
3:將棧頂值0給i
4:將變量i的值0放入棧頂
5:將常量1放入棧頂
6:取出棧top元素和top-1元素進行相加得1放入棧頂
7:取出棧頂1給i
因此打印結果i是1

下面我們再看看++i的過程是個什麼樣
代碼:

public class Test11 {
    public static void main(String[] args) {
        int i=0;
        i=++i;
    }
}

反編譯截圖:

0:將常量0放入棧頂
1:將棧頂元素0給i
2:   將局部變量表的值進行+1
5:將i的值放入棧頂
6:將i的值1賦值給i
因此打印i的結果是1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章