題目代碼
int i = 0, j = 0;
while (i < 5) {
j += i++;
}
System.out.println("i=" + i + ", j=" + j);

執行過程逐步追蹤
| 迴圈次數 | i (迴圈前) | j (迴圈前) | i++ 取值 | j += 值 | i (迴圈後) | j (迴圈後) |
| 1 | 0 | 0 | 0 | 0+0=0 | 1 | 0 |
| 2 | 1 | 0 | 1 | 0+1=1 | 2 | 1 |
| 3 | 2 | 1 | 2 | 1+2=3 | 3 | 3 |
| 4 | 3 | 3 | 3 | 3+3=6 | 4 | 6 |
| 5 | 4 | 6 | 4 | 6+4=10 | 5 | 10 |
| 結束 | 5 | 10 | - | - | 5 | 10 |
結果
i = 5, j = 10
核心規則:++ 位置決定「先用後增」還是「先增後用」
| 運算子 | 名稱 | 語義 | 範例 |
i++ | 後置遞增 | 先取值參與運算,再遞增 | int a=5; b=a++; // b=5, a=6 |
++i | 前置遞增 | 先遞增,再取值參與運算 | int a=5; b=++a; // b=6, a=6 |
i-- | 後置遞減 | 先取值,再遞減 | int a=5; b=a--; // b=5, a=4 |
--i | 前置遞減 | 先遞減,再取值 | int a=5; b=--a; // b=4, a=4 |
等價轉換
// 後置:j += i++;
int temp = i;
j += temp;
i = temp + 1;
// 前置:j += ++i;
i = i + 1;
j += i;
常見陷阱場景
// 1. 陣列索引
arr[i++] = val; // 正確:用舊索引存值,索引自動移下一位
arr[++i] = val; // 危險:先移動索引,可能越界
// 2. 循環條件
while (i++ < 5) { } // i 最終為 6
while (++i < 5) { } // i 最終為 5
// 3. 複合表達式
int x = 5;
int y = x++ + ++x; // 未定義行為 (C/C++) / 左到右求值 (Java: y=5+7=12, x=7)
最佳實務建議
- 獨立語句中
i++、++i 效果相同,建議統一用 i++ (慣例)
- 複合表達式中避免混用,拆分為多行提高可讀性
- 循環變數更新放在
for 第三欄位:for (int i=0; i<n; i++)