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

C 語言 for 迴圈完全指南:語法變體、控制流、嵌套、效能與現代最佳實踐

     編輯:關於C語言

標準語法


for (初始化語句; 條件表達式; 迭代表達式)
    循環體語句;

// 三部分皆可為空,分號不可省
for (;;) { /* 無限循環 */ }

執行流程

  1. 執行**初始化** (僅一次)。
  2. 求值**條件**:真(非零)→ 進入循環體;假(零)→ 結束循環。
  3. 執行**循環體**。
  4. 執行**迭代表達式**。
  5. 回步驟 2。

等價 while 形式:


初始化;
while (條件) {
    循環體;
    迭代;
}

豐富變體範例

1. 計數器變體


// 正向
for (int i = 0; i < n; i++) { }
// 反向 (無號陷阱: i >= 0 永真)
for (int i = n - 1; i >= 0; i--) { } // int 安全
for (size_t i = n; i-- > 0; ) { } // size_t 技巧:i-- 先比較後遞減,到 0 後下一次比較為 SIZE_MAX > 0 停止

// 步長
for (int i = 0; i < 100; i += 10) { }

2. 多變數控制 (逗號運算子)


for (int i = 0, j = n - 1; i < j; i++, j--) { } // 雙指針對撞
for (Node *p = head, *prev = NULL; p; prev = p, p = p->next) { } // 鏈表遍歷保留前驅

3. 指針/迭代器遍歷


int arr[10] = {1,2,3};
for (int *p = arr, *end = arr+10; p != end; ++p) { *p *= 2; }
// C++ 風格範圍 for (C 無原生支援)

4. 字串處理


for (char *p = str; *p; ++p) { putchar(*p); } // 以 '\0' 結束

5. 省略部分


int i = 0;
for (; i < 10; i++) { } // 省略初始化
for (i = 0; ; i++) { if (i > 10) break; } // 省略條件 (內部 break)
for (i = 0; i < 10; ) { i++; } // 省略迭代 (體內遞增)

控制流語句

語句作用適用循環
`break`**立即跳出**當前最內層循環/switchfor, while, do-while, switch
`continue`**跳過本次剩餘體**,直接執行迭代表達式 → 條件判斷for, while, do-while
`goto`跳轉標籤 (慎用,可跳出多層)所有
`return`跳出函數 (含循環)所有

關鍵差異:`for` 中 `continue` **會執行迭代表達式**;`while` 中 `continue` 直接跳回條件判斷 (需手動遞增避免死循環)。

嵌套循環與標籤跳出 (GCC/Clang 擴展)


outer: for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
        if (found) break outer; // 標準 C 無此語法,GCC/Clang 支援
        // 標準寫法:設置標誌位 或 封裝函數 return
    }
}

效能優化建議

  1. 循環不變量外提:`for (i=0; i
  2. 避免函數調用在條件/迭代中:`for (i=0; i
  3. 順序訪問記憶體**:行優先遍歷二維陣列 `a[i][j]` (內層 `j`),利用緩存預取。
  4. 循環展開**:`#pragma unroll` 或手寫 `i+=4` 處理 4 元素,減少分支預測失誤 (編譯器 `-O3 -funroll-loops` 自動)。
  5. 減少分支**:哨兵節點、位運算技巧替代條件判斷。

現代 C 最佳實踐 (C99/C11)

  • 變數就近聲明**:`for (int i = 0; ...)` 限制作用域,防止外部誤用。
  • 優先 `size_t` 索引陣列**:匹配 `sizeof` 返回類型,避免有號/無號比較警告。
  • 範圍 for 替代品**:宏封裝 `FOR_EACH(item, array)` 或函數指針回調 `array_foreach(arr, callback)`。
  • 避免 `goto` 跳出多層**:重構為函數 `return` 或 `bool found = false; for(...) if(found) break;`。

經典面試題:輸出 0-99,10 個換行


for (int i = 0; i < 100; i++) {
    if (i % 10 == 0 && i != 0) putchar('\n'); // 或 i && i%10==0
    printf("%2d ", i);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved