C語言迴圈處理完整解說|for、while、do…while 的差異與使用時機

目次

1. 前言

C 語言中的「迴圈處理」是什麼?

C 語言因能撰寫緊湊且高效的程式碼,至今仍在許多現場被廣泛使用。其中特別是「迴圈處理」,幾乎會出現在所有程式中,這並不誇張。 迴圈處理是指 自動重複執行特定處理的機制。例如,用於顯示 1 到 10 的數字,或根據條件多次接受使用者輸入的情況。

為什麼「迴圈處理」很重要?

如果沒有迴圈處理,就必須手動寫多行相同的程式碼。這不僅降低可維護性,容易成為錯誤的溫床,還會使整個程式變得冗長。 因此,在 C 語言中,提供了以下三種基本的「迴圈處理」語法。
  • for 迴圈:用於次數明確固定的迴圈
  • while 迴圈:在條件成立時持續執行處理時使用
  • do…while 迴圈:至少要執行一次處理時使用
透過適當選擇這些迴圈語句,可使程式更具彈性且更有效率地構建。

本文將說明的內容

本文將詳細說明 C 語言中各種迴圈語法的使用方式與差異、實作範例,以及常見錯誤與注意事項。即使是剛開始學習 C 語言的讀者,也能因為我們盡力提供清晰的說明而輕鬆閱讀。

2. for 迴圈的基本與用法

什麼是 for 迴圈?

在 C 語言中,for 迴圈 是最適合用於事先已決定重複次數的處理的語法。例如,「逐一顯示 1 到 100 的數值」或「只重複 10 次的處理」等情況下,for 迴圈 既簡潔又明瞭。

for 迴圈的基本語法

for (初始化式; 條件式; 變化式) {
    // 想要重複執行的處理
}
各部分的意義如下:
  • 初始化式:將計數器變數初始化(例:int i = 0;
  • 條件式:只要此條件為 true,迴圈就會持續
  • 變化式:每次迴圈時對計數器增減(例:i++

具體範例:顯示 1 到 10 的數值

#include <stdio.h>

int main() {
    for (int i = 1; i <= 10; i++) {
        printf("%d
", i);
    }
    return 0;
}
在此程式碼中,變數i從 1 增加到 10,每次遞增 1,重複 10 次並使用 printf 顯示。這是一個非常直觀且具高可讀性的迴圈處理範例。

使用 for 迴圈的好處

  • 如果處理次數明確,程式碼會更簡短
  • 初始化、條件、更新可寫在同一行,易於閱讀
  • 與陣列相性良好,適合依序處理元素

注意事項:避免無限迴圈

如以下所示,若條件式永遠為真(true),則會產生無限迴圈。
for (;;) {
    // 無限重複執行
}
這在想要刻意製造無限迴圈時會使用,但通常需注意因條件式指定錯誤而產生的非預期的無限迴圈

break 與 continue 的活用

for 迴圈 中若想在迴圈中途結束則使用 break,若想跳過特定條件則使用 continue。 pre>for (int i = 1; i <= 10; i++) { if (i == 5) continue; // 5 被跳過 if (i == 8) break; // 當 i 為 8 時結束迴圈 printf("%d ", i); } 輸出為「1〜4, 6, 7」。

3. while語句的基本與使用方式

while語句是什麼?

while文是、在條件成立期間,重複執行處理的語法。for文與不同,適用於迴圈次數不明確,或根據使用者輸入或外部資料狀態持續處理的情況。 例如,「使用者輸入正確值之前持續重複」的處理中,while文直觀。

while語句的基本語法

while (条件式) {
    // 想要重複執行的處理
}
  • 條件式true為止,會重複執行區塊內的處理。
  • 如果條件從一開始就是false,需要注意會一次也不執行

具體範例:顯示 1 到 10 的數值

#include <stdio.h>

int main() {
    int i = 1;
    while (i <= 10) {
        printf("%d
", i);
        i++;
    }
    return 0;
}
此程式碼以 while文 實現了與 for文 幾乎相同的動作。不同之處在於必須在迴圈外寫入初始化(int i = 1;)與變化(i++)的部分。

while語句發揮作用的情境:使用者輸入的控制

#include <stdio.h>

int main() {
    int input = 0;
    while (input != -1) {
        printf("請輸入數值(若要結束請輸入 -1):");
        scanf("%d", &input);
    }
    printf("結束。\n");
    return 0;
}
如此,直到使用者輸入特定值為止持續迴圈的處理,while文直觀。

注意點:容易產生無限迴圈

如果在 while文 的條件式中沒有變化,可能會不小心產生無限迴圈。以下為 NG 範例。
int i = 1;
while (i <= 10) {
    printf("%d
", i);
    // 若忘記 i++ 會導致無限迴圈…
}
→ 請務必記得在迴圈中變更變數的狀態。

break 與 continue 的活用

即使在 while文 中,也可以像 for文 一樣使用 breakcontinue
int num = 0;
while (num < 10) {
    num++;
    if (num == 5) continue; // 跳過 5
    if (num == 8) break;    // 8 時結束
    printf("%d
", num);
}
輸出結果為「1〜4, 6, 7」。

4. do…while 迴圈的基本與使用方式

什麼是 do…while 迴圈?

do...while 迴圈是 C 語言可使用的三種迴圈結構之一,具備唯一「一定會執行一次」的特點。 在一般的 while 迴圈 中,如果最初的條件判斷為 false,則不會執行任何處理;但在 do...while 迴圈 中,先執行處理區塊,之後再檢查條件。 因此,適用於「即使只想接受一次使用者輸入」或「至少要執行一次讀取檔案的處理」等情況。

do…while 迴圈的基本語法

do {
    // 想要重複執行的處理
} while (條件式);
※ 請注意 while 後面需要加上分號(;)。

具體範例:顯示 1 到 10 的數值

#include <stdio.h>

int main() {
    int i = 1;
    do {
        printf("%d
", i);
        i++;
    } while (i <= 10);
    return 0;
}
此程式碼會像 for 迴圈while 迴圈 一樣顯示 1〜10 的數值。但在 do...while 迴圈 中,處理先執行,條件則在之後檢查。

具特色的用法:重新要求使用者輸入

#include <stdio.h>

int main() {
    int number;
    do {
        printf("請輸入 10 以上的數值:");
        scanf("%d", &number);
    } while (number < 10);
    printf("感謝。輸入的值:%d
", number);
    return 0;
}
在此範例中,若使用者輸入小於 10 的數值,會再次要求輸入。 do...while 迴圈最適用於 以至少執行一次為前提 的情境。

do… 迴圈的優點與注意事項

優點
  • 一定會執行一次處理
  • 適合等待輸入或初始處理
注意事項
  • 因為處理先執行,若條件式設定不正確,可能會不小心執行兩次以上。
  • 雖然使用頻率比 for 迴圈while 迴圈 稍低,但若適當使用,會非常便利。

break 與 continue 的使用

do...while 迴圈中,breakcontinue 仍然有效。可依條件或次數彈性控制迴圈。
int i = 0;
do {
    i++;
    if (i == 3) continue; // 跳過 3
    if (i > 5) break;     // 顯示到 5
    printf("%d
", i);
} while (i < 10);
輸出結果為「1, 2, 4, 5」。

5. for文與while文、do…while文的使用區別

了解各迴圈語句的差異

C 語言有三種迴圈結構(for、while、do…while),使用任何一種都能實現「迴圈處理」。 那麼,為什麼會提供多種迴圈結構呢? 因為每種都有適合的情境與易用性。 在此,我們將說明如何區分使用這三種迴圈語句,讓初學者也能容易理解。

for迴圈:在迭代次數已確定時使用

for文是因為迴圈的起始、結束條件與變化處理都集中在一行,所以具有非常好的可讀性。
for (int i = 0; i < 10; i++) {
    // 執行 10 次的處理
}
這樣,當「固定次數」已確定時,首先考慮使用for文。尤其在陣列掃描與計數器控制上非常適合。

while迴圈:在條件滿足的情況下持續迭代時使用

while文迭代次數不明確的情況下很方便。 例如,依賴使用者輸入或感測器數值等外部資訊的處理,while文的彈性就會發揮作用。
while (!終了条件) {
    // 條件為 true 時,持續執行的處理
}

do…while迴圈:至少要執行一次時使用

do...while文用於「想先執行一次處理再判斷」的情境。
do {
    // 第一次必定執行
} while (条件);
例如,「先顯示一次選單,再詢問使用者是否要重新顯示」的情境很適合。

使用區別速查表

處理內容適合的迴圈結構
次數已確定的迴圈for文
想在條件為 true 時持續執行的情況while文
至少要執行一次的情況do…while文
需要陣列或帶索引的處理for文(特別推薦)
輸入成為結束條件的處理while文或do…while文

實際上使用哪一個都可以嗎?

當然,同樣的處理可以用for文while文實作。然而,為了提升程式碼的可讀性與維護性,選擇「適當的結構」是很重要的。 例如,當迭代次數明確卻用while文實作時,條件與計數器會散落在迴圈外,導致可讀性變差。相反地,若用for文寫需要多次接受使用者輸入的處理,則程式意圖會變得難以傳達。

選擇最適的迴圈能導致更易讀且錯誤較少的程式碼

迴圈結構不是依「外觀」或「模糊的習慣」來選擇,而是依照處理目的適當選擇,這會提升程式品質。

6. 重複處理的注意事項

迴圈處理很方便,但若不注意會成為錯誤的溫床

重複處理是程式設計中最基本的基礎,且相當便利的語法。然而,同時也是因為迴圈設計失誤或寫法不當,容易導致意外的缺陷或錯誤的環節。 在此,我們說明在 C 語言中安全且正確使用重複處理時,必須注意的要點。

如何防止無限迴圈

最常見的問題之一是「無限迴圈」。這指的是迴圈的結束條件永遠不會滿足,導致程式無法停止的情況。 例如,以下程式碼需要特別留意。
int i = 0;
while (i < 10) {
    printf("%d
", i);
    // 若忘記 i++,迴圈會永遠持續
}
在此情況下,若忘記加入 i++i 的值不會變化,條件會永遠為 true對策:
  • 不只檢查條件式,還要持續確認「變化式」是否正確執行
  • 留意迴圈執行期間條件是否有變化

break 陳述的適當使用方式

break 是用來強制跳出迴圈的控制語句。雖然方便,但若過度使用會使程式變得難以理解。 如上所示,常以 while (1) 為前提的無限迴圈,並在特定條件下使用 break,這種寫法相當常見。為了維持可讀性,加入適當的註解或將其抽離成函式是有效的做法。
while (1) {
    int input;
    scanf("%d", &input);
    if (input == 0) break; // 輸入 0 時結束迴圈
}

使用 continue 時需注意過度使用

continue 是用來跳過目前迴圈剩餘的處理,直接進入下一次迭代的控制語句。若適當使用可整理流程,但在條件分支複雜的程式中過度使用,會反而讓人難以理解
for (int i = 0; i < 10; i++) {
    if (i % 2 == 0) continue; // 偶數則跳過
    printf("%d
", i);        // 只顯示奇數
}
此類簡潔的用途是有效的,但當條件增多或巢狀結構變深時,需特別留意。

多重迴圈(巢狀迴圈)中的注意事項

在重複處理中再加入迴圈的「多重迴圈(巢狀)」也是常見且便利的模式。然而,巢狀層級過深會使程式碼變得複雜,可能導致以下問題。
  • 處理的意圖難以閱讀
  • 效能下降(特別是三層以上迴圈)
  • 變數重複使用導致錯誤
for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        printf("i=%d, j=%d
", i, j);
    }
}
這種程度的巢狀尚無問題,但若層級加深則應拆分成函式,或以註解補充說明等方式,提升可讀性。

注意條件式的錯誤與邊界值的 Bug

在迴圈條件中使用「<」或「<=」等比較運算子時的錯誤,也是一個容易產生少一次或多一次等邏輯錯誤的關鍵點。
// 想輸出 0~9 時
for (int i = 0; i <= 9; i++)  // 正確
// ↓

 // 若誤寫成 <,則只能輸出 0~8
for (int i = 0; i < 9; i++)   // 成為 Bug 的原因
重複處理對「邊界值」非常敏感,務必常確認目標的次數與範圍是否正確指定

7. 常見問題(FAQ)

Q1. for 迴圈與 while 迴圈的差異是什麼?

A: 兩者都是執行重複處理的語法,但主要在以下幾點上區分使用:
  • for文是基本上在已知重複次數的情況下使用。因為可以在一行內寫入計數變數的初始化、條件、更新處理,具備良好的可讀性。
  • while文適用於只要條件成立就持續重複的情況。在處理次數不明或需要根據條件重複時非常有用。
範例:
<>// for 迴圈(執行 10 次)
for (int i = 0; i < 10; i++) {
    // 處理
}

// while 迴圈(僅在滿足特定條件時重複)
while (条件) {
    // 處理
}

Q2. 何時使用 do…while 迴圈?

A: do...while文至少要執行一次處理的情況下使用。 例如,「首先必定顯示選單,之後根據使用者的選擇繼續處理」的情境非常適合。
int option;
do {
    printf("1. 重新顯示  2. 結束:");
    scanf("%d", &option);
} while (option == 1);
如此,前提是處理從第一次起就無條件執行的邏輯,do...while文是適當的。

Q3. 如何防止無限迴圈?

A: 無限迴圈是指迴圈的結束條件永遠不會滿足,導致處理無法停止的狀態。在 C 語言中常見以下原因:
  • 未更新計數變數
  • 條件式設計錯誤,導致永遠為真(true)
  • 迴圈的結束條件未正確設定
對策如下:
  • for文while文 中,確認變數是否有變化
  • 重新檢查結束條件是否正確設定
  • 在除錯時,加入在一定次數後強制結束的安全機制(例如:計數上限)也是有效的

Q4. break 與 continue 的差異是?

A: 兩者皆用於迴圈控制,但行為不同:
  • break結束整個迴圈。通常在某條件滿足時想要中途跳出迴圈時使用。
  • continue跳過本次迴圈的處理,並進入下一次迭代。
範例:
for (int i = 1; i <= 5; i++) {
    if (i == 3) continue; // 3 被跳過
    if (i == 5) break;    // 5 結束迴圈
    printf("%d
", i);
}
輸出結果為「1, 2, 4」。

Q5. 若不確定該使用哪種迴圈結構?

A: 如以下思考方式,較易選擇:
情況應選擇的語法
次數已確定for文
想要在條件成立時持續執行while文
至少要執行一次的情況do…while文
此外,考慮可讀性與團隊的程式碼風格,選擇「一眼即可傳達意圖的語法」是最佳做法。

8. 總結

在本文中,我們說明了 C 語言中作為迴圈處理基礎的for 迴圈while 迴圈do…while 迴圈這三種迴圈語法,並解釋了各自的使用方式與選擇要點。 迴圈處理是程式設計中最基本且非常強大的機制。它在自動化處理、輸入的重複、依條件的迴圈等各種情境中皆會出現。

各迴圈語法回顧

  • for 迴圈:適用於迴圈次數明確的情況。因為可以在一行內寫入計數變數與迴圈條件,具備良好的可讀性。
  • while 迴圈:在條件成立的期間持續執行處理時使用。可根據外部輸入或狀態變化彈性處理。
  • do…while 迴圈:保證至少執行一次處理,適用於需要先執行一次的情況。

處理迴圈時的注意事項

  • 注意無限迴圈與條件式的寫錯
  • 正確理解 break/continue 的使用方式與效果
  • 注意程式結構,避免巢狀過深
  • 選擇易於閱讀意圖的語法

最後:學習技巧

迴圈處理最有效的學習方式是實際動手寫程式碼。先從簡單的遞增計數或條件迴圈開始,逐步挑戰使用者輸入與巢狀迴圈等進階內容。 支撐您程式設計技能的其中一根支柱,就是這個「迴圈處理」。請務必以本文為參考,親自撰寫程式碼並執行體驗。
年収訴求