public class BlackDemo2 {
static int i;
public static void main(String[] args) {
for (i = 0; i < 3; i++) {
int a = 0;
int b = 0;
a += i;
System.out.println("第 " + i + " 次運行時的 i 值是 " + i);
}
System.out.println("跳出 for 循環時 i 的值是 " + i);
}
}
第 0 次運行時的 i 值是 0
第 1 次運行時的 i 值是 1
第 2 次運行時的 i 值是 2
跳出 for 循環時 i 的值是 3
| 階段 | i 的值 | 條件 i < 3 | 動作 |
|---|---|---|---|
| 初始化 | 0 | true | 進入循環體 |
| 第 1 次迭代結束 | 1 (i++) | true | 進入循環體 |
| 第 2 次迭代結束 | 2 (i++) | true | 進入循環體 |
| 第 3 次迭代結束 | 3 (i++) | false | 跳出循環 |
i 定義為 static 類變量,作用域為整個類,循環結束後 i 保留最後更新後的值(3)。i = 3 時,i < 3 為 false,循環終止。此時 i 已經是 3。❌ 錯誤認知:「循環執行 3 次,i 應該是 2」
✅ 正確理解:「循環執行 3 次,但 i++ 共執行了 3 次(0→1, 1→2, 2→3),最後一次判斷失敗時 i=3」
// 推薦:將循環變量限制在 for 內部,避免污染外部作用域
for (int i = 0; i < 3; i++) {
// 此處 i 僅在循環內可見
}
// 這裡訪問 i 會編譯報錯
這樣既符合「最小作用域原則」,也能避免循環後誤用變量值的 Bug。