1. 程式人生 > 實用技巧 >i++ & ++i不看位元組碼是真的難懂

i++ & ++i不看位元組碼是真的難懂

package club.interview.base;

/**
* ++i 先"++"後賦值
* i++ 先賦值後"++"
* i++ 區域性變量表的值會改變,但是運算元棧並不會變,後面需要使用會把區域性變量表中的值放入運算元棧
* <p>
* --- 參考內容 (你值得擁有)
* * jvms檔案
* * jclasslib 工具外掛
*
* @author QuCheng on 2020/7/6.
*/
public class IAdd { /**
* i++是先賦值後++ ++i是先++後賦值
* 計算機是逐個擊破,不是先搜尋所有運演演算法
* 0 iconst_2
* 1 istore_1
* 2 iload_1 棧 [2]
* 3 iinc 1 by 1
* 6 iload_1 棧 [3,2]
* 7 iadd 棧 [5]
* 8 iinc 1 by 1
* 11 iload_1 [4,5]
* 12 iadd [9]
* 13 iload_1 [4,9]
* 14 iadd [13]
* 15 istore_1 []
* 16 getstatic #2 <java/lang/System.out>
* 19 iload_1 [13]
* 20 invokevirtual #3 <java/io/PrintStream.println> []
* 23 return
*/
private void sunmmary() {
int i = ;
// // 2 3 4 4
i = i++ + i + ++i + i;
System.out.println(i);
} /**
* 區域性變量表 -> lvt
* 0 iconst_0 將0push到棧頂
* 1 istore_1 將0從棧頂彈出 lvt(index1 = 0)
* 2 iinc 1 by 1 棧空 lvt(index1 = 1)
* 5 getstatic #2 <java/lang/System.out>
* 8 iload_1 棧頂為1 lvt(index1 = 1)
* 9 invokevirtual #3 <java/io/PrintStream.println>
* 12 return
*/
private void step1() {
int i = ;
i++;
System.out.println(i);
} /**
* 0 iconst_0 將常量0放入運算元棧棧頂 棧頂為0
* 1 istore_1 將棧頂的int元素賦值給區域性變量表第1個位置(彈出)| 棧空 區域性變量表index1為0
* 2 iload_1 將區域性變量表第1個位置的值push到運算元棧棧頂 | 棧頂為0 區域性變量表index1為0
* 3 iinc 1 by 1 將第一個位置的區域性變數加1(by 1) | 0-> 1 棧頂為0 區域性變量表index1為1
* 6 istore_1 同上(賦值) | 棧空 區域性變量表index1為0 (被覆蓋)
* 7 getstatic #2 <java/lang/System.out>
* 10 iload_1 讀取區域性變數1位置到棧頂 | 棧頂為0 區域性變量表index1為0
* 11 invokevirtual #3 <java/io/PrintStream.println> 列印是將區域性變量表中的值放入運算元棧棧頂,然後讀取
* 14 return
*/
private void test2() {
int i = ;
i = i++;
System.out.println(i);
} /**
* 0 iconst_0
* 1 istore_1
* 2 iload_1 (理解的關鍵點 把區域性變量表中index1位置的值放入棧頂 為了之後賦值)
* 3 iinc 1 by 1
* 6 istore_2 lvt(index2 = 0)
* 7 getstatic #2 <java/lang/System.out>
* 10 iload_1 將lvt(index1 = 1) 放入棧頂
* 11 invokevirtual #3 <java/io/PrintStream.println>
* 14 getstatic #2 <java/lang/System.out>
* 17 iload_2 將lvt(index2 = 0) 放入棧頂
* 18 invokevirtual #3 <java/io/PrintStream.println>
* 21 return
*/
private void step3() {
int i = ;
int j;
j = i++;
System.out.println(i);
System.out.println(j);
} private void step4() {
int i = ;
int j;
j = ++i;
System.out.println(i);
System.out.println(j);
} public static void main(String[] args) {
IAdd i = new IAdd();
i.sunmmary();
}
}