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

Java for 循環中 `j += j++` 為什麼結果全是 0?運算符優先級與後綴自增陷阱深度解析

     編輯:程式設計綜合問答

問題代碼

for (int i = 0, j = 0; i < 10; i++) j += j++;
// 輸出:j 始終為 0

執行過程逐步拆解

  1. `j` 初始為 0。
  2. `j++`:**後綴自增**,表達式值為**自增前的值**(0),然後 `j` 變為 1。
  3. `j += j++` 等價於 `j = j + (j++)`。 - 右邊 `j++` 返回 0。 - 左邊 `j` 當前已變為 1(因自增已完成)。 - 但 **復合賦值 `+=` 的左邊變量值在表達式開始前已捕獲**(Java 語言規範:左邊變量值先讀取保存),此處捕獲的舊值為 0。 - 計算:`0 + 0 = 0`,賦值給 `j` → `j = 0`。
  4. 循環繼續,`j` 永遠被重置為 0。

關鍵規則:復合賦值 `+=` 的求值順序

// Java 語言規範 §15.26.2
E1 op= E2  等價於  E1 = (T) ((E1) op (E2))
// 關鍵點:E1 只求值一次,且在 E2 之前求值

因此 `j += j++` 步驟為:

  1. 讀取左邊 `j` 的值 → 保存為 0(暫存)。
  2. 求值右邊 `j++` → 返回 0,`j` 變為 1。
  3. 執行加法:0 + 0 = 0。
  4. 賦值給 `j` → `j = 0`。

對比:改為前綴自增 `j += ++j`

for (int i = 0, j = 0; i < 10; i++) j += ++j;
// i=0: j=0 → ++j=1 → 0+1=1 → j=1
// i=1: j=1 → ++j=2 → 1+2=3 → j=3
// i=2: j=3 → ++j=4 → 3+4=7 → j=7
// ... 指數級增長

最佳實踐建議

  • **避免在同一表達式中對同一變量進行寫操作**(自增/自減/賦值)後再讀取,行為易混淆。
  • 拆分為清晰語句:
    j = j + j; // 或 j *= 2;
    j++;
  • 若需累加,直接用 `j += 1` 或 `j++`,不要混用復合賦值與自增。

理解求值順序與副作用,才能寫出可預測、可維護的代碼。

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