int i = 0;
i = i++;
System.out.println(i); // 輸出 0
0: iconst_0 // 常數 0 入棧
1: istore_1 // 存入局部變量表 slot 1 (i=0)
2: iload_1 // 載入 slot 1 入棧 (棧: 0)
3: iinc 1, 1 // slot 1 自增 1 (i=1),棧頂仍為 0
6: istore_1 // 彈出棧頂 0 存入 slot 1 (i=0)
7: getstatic System.out
10: iload_1 // 載入 slot 1 (0)
11: invokevirtual print
iinc 直接操作局部變量表,**不影響操作數棧**。++ 的語義是:「取原值參與表達式,副作用自增」。i = ... 的右側表達式值是 i++ 的**原值**(0),故最終覆蓋了自增結果。int i = 0;
i = ++i; // 字節碼: iinc 先執行,再 iload,結果 i=1
永遠不要在同一條語句中對同一變量同時讀寫並依賴副作用順序。Java 語言規範明確定義了求值順序,但代碼可讀性極差,易引入 Bug。拆分為兩句:i++; i = i; 或直接 i++;。