首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java i = i++ 為什麼結果是 0?字節碼級深度解析

     編輯:程式設計綜合問答

現象

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

關鍵點

  1. iinc 直接操作局部變量表,**不影響操作數棧**。
  2. 後綴 ++ 的語義是:「取原值參與表達式,副作用自增」。
  3. 賦值語句 i = ... 的右側表達式值是 i++ 的**原值**(0),故最終覆蓋了自增結果。

對比:++i

int i = 0;
i = ++i; // 字節碼: iinc 先執行,再 iload,結果 i=1

最佳實踐

永遠不要在同一條語句中對同一變量同時讀寫並依賴副作用順序。Java 語言規範明確定義了求值順序,但代碼可讀性極差,易引入 Bug。拆分為兩句:i++; i = i; 或直接 i++;。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved