| 循環類型 | 語法 | 執行順序 | 關鍵特性 |
|---|---|---|---|
| for | for (init; cond; step) stmt; | init → cond → stmt → step → cond … | 計數器初始化/更新集中、適合已知次數 |
| while | while (cond) stmt; | cond → stmt → cond … | 先判斷後執行、可能零次、適合未知次數 |
| do-while | do stmt; while (cond); | stmt → cond → stmt … | **先執行後判斷、至少一次**、適合菜單/輸入驗證 |
// for → while
for (i=0; i
for ( ; ; ) { ... } // 無限迴圈,等價 while(1)
for (i=0; i
⚠️ **分號不能省略**,for (i=0 i
while (i < n); // ❌ 死循環或空轉,body 被視為空語句
{ i++; } // 這裡不屬於 while
do { ... } while (cond) // ❌ 缺分號,編譯錯誤
do { ... } while (cond); // ✅
for (int i = 0; i < n; i++) { ... } // i 僅在 for 作用域內可見
// C89 需外部聲明 int i; for (i=0; ...)
// 經典 off-by-one
for (int i = 0; i <= n; i++) // 共 n+1 次,通常錯誤
for (int i = 0; i < n; i++) // 共 n 次,正確
for(語義清晰、編譯器易優化向量化)。while。do-while。// 手動展開(編譯器 -funroll-loops 會自動做)
for (int i = 0; i < n; i += 4) {
process(a[i]);
process(a[i+1]);
process(a[i+2]);
process(a[i+3]);
}
// 帶標籤的 break/continue(跳出多層迴圈)
outer: for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (found) break outer; // 直接跳出外層
}
}
while(cond); 空體、do{}while(); 必加分號。