| 版本 | 關鍵邏輯 | 輸出 i | 實際立方和狀態 |
|---|---|---|---|
| 1. for 判斷在條件 | sum < 1e6 判斷 → 執行體 → i++ | 46 | i=45 時 sum 已超,但 i++ 後才退出 |
| 2. break 立即跳出 | 累加 → 判斷超過 → break | 45 | i=45 時 sum 首次超過,break 前 i 不再增 |
| 3. bool 標誌後判斷 | 累加 → 更新標誌 → 循環條件檢查標誌 → i++ | 46 | 同版本1,標誌更新在體內,i++ 在條件後 |
| 4. 標誌前判斷 | 更新標誌 → 累加 → 條件檢查 → i++ | 47 | i=46 時標誌已真,仍執行體一次並 i++ |
| 5. break 後 i-- | break → i-- → 輸出 | 45 | 修正版本2,輸出真正超過的 i |
for (init; condition; increment) body;
// 等價於
init;
while (condition) {
body;
increment;
}
關鍵:increment 在 body 之後、下一次 condition 之前執行。無論 break、continue、return 如何跳轉,increment 只在正常完成 body 後執行。
// 目標:找到最小的 n,使 1^3+...+n^3 > 1,000,000
int n = 0;
long sum = 0;
while (sum <= 1_000_000) {
n++;
sum += n * n * n;
}
System.out.println("n = " + n); // 45
System.out.println("sum = " + sum); // 1,071,225
或使用 for 但語義清晰:
int n;
long sum = 0;
for (n = 1; sum <= 1_000_000; n++) {
sum += n * n * n;
}
// 循環結束時 n 已經是 46,需 n-1
System.out.println("n = " + (n - 1));
掌握 for 循環精確語義,是寫出正確邊界代碼的基礎功力。