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

C 語言巢狀迴圈轉換:for 迴圈改寫 while 迴圈的關鍵 — 內層計數器重置

     編輯:C 語言問答

原問題代碼對比

for 版 (正確輸出 9x9 乘法表)


for (a = 1; a < 10; a++)
    for (b = 1; b < 10; b++)
        printf("%d %d\n", a, b);

while 版 (錯誤:內層 b 不重置)


a = 1; b = 1;
while (a < 10) {
    while (b < 10) { // b 只初始化一次!
        printf("%d %d\n", a, b);
        b++;
    }
    a++;
}

結果:外層 a=1 時,內層 b 跑 1→9。外層 a=2 時,b 已為 10,內層 while(b<10) 直接跳過,**後續外層迴圈完全不執行內層**。

正確 while 版:內層計數器必須在外層迴圈內部初始化


a = 1;
while (a < 10) {
    b = 1; // 【關鍵】每進入外層一次,內層計數器歸零/重置
    while (b < 10) {
        printf("%d %d\n", a, b);
        b++;
    }
    a++;
}

通用轉換模式

for 結構等價 while 結構
for (init; cond; update) {
    body;
}
init;
while (cond) {
    body;
    update;
}
for (i=0; i
i = 0;
while (i < n) {
    j = 0; // 內層初始化在外層體內!
    while (j < m) {
        body;
        j++;
    }
    i++;
}

for 迴圈三大優勢 (何時優先用 for)

  1. 初始化、條件、更新集中在一行:易讀、不易遺漏更新 (如 i++)。
  2. 迴圈變數作用域可限制在 for 內 (C99):for (int i=0; ...),i 迴圈外不可見,減少汙染。
  3. 編譯器優化更友好:靜態分析易識別迴圈結構,向量化/展開更激進。

while 迴圈適用場景

  • 迴圈次數未知,依賴動態條件 (如 while(fgets(buf, n, fp)))。
  • 複雜的多條件跳出邏輯 (配合 break/continue)。
  • 迴圈體前需要複雜初始化,或迴圈後需檢查狀態。
  • 總結

    巢狀迴圈轉換鐵律:內層初始化/重置語句必須移至外層迴圈體內部。這是 for 自動語義 (每輪進入隱含重置) 與 while 手動語義的核心差異。養成「寫 while 先想:哪些變數要在每輪重置?」的習慣。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved