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文
一樣使用 break
或 continue
。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 迴圈
中,break
與 continue
仍然有效。可依條件或次數彈性控制迴圈。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 的使用方式與效果
- 注意程式結構,避免巢狀過深
- 選擇易於閱讀意圖的語法
最後:學習技巧
迴圈處理最有效的學習方式是實際動手寫程式碼。先從簡單的遞增計數或條件迴圈開始,逐步挑戰使用者輸入與巢狀迴圈等進階內容。 支撐您程式設計技能的其中一根支柱,就是這個「迴圈處理」。請務必以本文為參考,親自撰寫程式碼並執行體驗。