首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C語言三大循環結構全解析:for、while、do-while 異同與轉換

     編輯:C 語言問答

語法速查表

循環類型語法執行順序關鍵特性
forfor (init; cond; step) stmt;init → cond → stmt → step → cond …計數器初始化/更新集中、適合已知次數
whilewhile (cond) stmt;cond → stmt → cond …先判斷後執行、可能零次、適合未知次數
do-whiledo stmt; while (cond);stmt → cond → stmt …**先執行後判斷、至少一次**、適合菜單/輸入驗證

三者相互轉換(等價變換)

// for → while
for (i=0; i

常見陷阱與最佳實踐

1. for 迴圈表達式省略

for ( ; ; ) { ... }        // 無限迴圈,等價 while(1)
for (i=0; i

⚠️ **分號不能省略**,for (i=0 i 編譯錯誤。

2. while 條件後加分號 = 空循環體

while (i < n);  // ❌ 死循環或空轉,body 被視為空語句
{ i++; }        // 這裡不屬於 while

3. do-while 必須以分號結尾

do { ... } while (cond)  // ❌ 缺分號,編譯錯誤
do { ... } while (cond); // ✅

4. 迴圈變量作用域(C99)

for (int i = 0; i < n; i++) { ... }  // i 僅在 for 作用域內可見
// C89 需外部聲明 int i; for (i=0; ...)

5. 迴圈不變量與邊界檢查

// 經典 off-by-one
for (int i = 0; i <= n; i++)  // 共 n+1 次,通常錯誤
for (int i = 0; i < n; i++)   // 共 n 次,正確

性能對比(現代編譯器 -O2 後基本一致)

  • 已知次數優先 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; // 直接跳出外層
    }
}

總結

  • for:計數器管理集中,已知次數首選。
  • while:條件驅動,未知次數、可能零次。
  • do-while:體驗驅動,至少一次(菜單、輸入驗證)。
  • 三者**可相互機械轉換**,選**語義最清晰**者。
  • **分號位置**是新手最大坑:while(cond); 空體、do{}while(); 必加分號。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved