/* for 迴圈 */
for (init; condition; step) {
body;
}
/* 等價 while 迴圈 */
init;
while (condition) {
body;
step;
}
| for 子句 | while 對應位置 | 執行時機 |
|---|---|---|
init | while 之前 | 僅一次,迴圈開始前 |
condition | while (condition) | 每次迴圈開始前判斷 |
step | 迴圈主體結尾 | 每次迴圈結束後執行 |
int sum = 0;
for (int i = 1; i <= 10; ++i) {
sum += i;
}
int sum = 0;
int i = 1; // init
while (i <= 10) { // condition
sum += i; // body
++i; // step
}
for (;;) { ... } // 慣用寫法
while (1) { ... } // 等價
for (int i = 0; i < 10; ++i) { /* i 僅在 for 內可見 */ }
while (i < 10) { ... } // 錯誤:i 不在作用域
for 迴圈宣告的變數作用域限制在迴圈內 (C99),while 需自行管理。
for (int i = 0; i < 10; ++i) {
if (i == 5) continue;
printf("%d ", i);
// continue 仍會執行 ++i (step 子句)
}
int i = 0;
while (i < 10) {
if (i == 5) { ++i; continue; } // 必須手動執行 step 否則無限迴圈!
printf("%d ", i);
++i;
}
鐵律:`while` 中使用 `continue` 時,**必須確保 step 邏輯已執行**,否則陷入無限迴圈。
int i = 0;
for (; i < 10; ) { ... } // 合法:init/step 可為空
while (i < 10) { ... } // 等價
| 場景 | 推薦 | 理由 |
|---|---|---|
| 已知迴圈次數 / 計數器驅動 | for | 三段式集中,作用域自動管理,不易漏寫 step |
| 條件驅動 / 不定次數 / 複雜終止條件 | while | 語意更清晰:當條件成立時持續執行 |
| 至少執行一次 | do-while | 條件在結尾判斷 |
| 雙重巢狀迴圈外層需控制內層變數 | 視情況 | for 方便重置內層計數器 |
// 多重初始化/步進 (逗號運算子)
for (int i = 0, j = 10; i < j; ++i, --j) { ... }
// 範圍基礎 for (C++20 / GNU 擴展非標準)
// C 標準無此功能,需手寫
for 與 while **圖靈完備等價**,但**工程語意不同**。掌握三段式對應、continue 差異、作用域規則,根據「計數器 vs 條件」語意選擇,才能寫出更少 Bug、更易讀的代碼。