循環結構是程式設計中不可或缺的控制流程機制,其核心在於「在給定條件成立時,重複執行特定程式區塊,直到條件不成立為止」。這個給定條件稱為循環條件,被重複執行的程式區塊則稱為循環體。C 語言提供了 while、do-while 和 for 三種主要循環語句,靈活構建各種迴圈邏輯。
while (表達式) 語句;
表達式 即循環條件,語句 為循環體。執行流程:先計算表達式的值,若為真(非零),則執行循環體;執行完畢後再次判斷條件,以此類推。
#include <stdio.h>
void main() {
int n = 0;
printf("input a string:\n");
while (getchar() != '\n') n++;
printf("%d", n);
}
此處循環條件 getchar() != '\n' 表示:只要讀取的字元不是換行符,就持續循環,n++ 完成計數。
{} 括起形成複合語句。while(a=5) 因賦值表達式恆為真,且循環體無跳出機制,將導致死循環。while 循環體內再包含 while,形成多重循環。do
語句;
while (表達式);
執行流程:先無條件執行一次循環體,再判斷條件,若為真則繼續循環。因此 do-while 至少執行一次循環體,這是它與 while 的本質區別。
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
do printf("%d ", a++ * 2);
while (--n);
}
注意:條件改為 --n 而非 n--,因為先執行後判斷的特性會導致多執行一次。
if、while 不同。while 相互嵌套。{} 括起。while 互換時,需修改循環控制條件以保持邏輯等價。for (表達式1; 表達式2; 表達式3)
語句;
三表達式皆可為逗號表達式(含多個子表達式),皆為可選項。
void main() {
int n, s = 0;
for (n = 1; n <= 100; n++)
s = s + n;
printf("s=%d\n", s);
}
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
for (; n > 0; a++, n--)
printf("%d ", a * 2);
}
表達式1省略(初值由 scanf 取得),表達式3為逗號表達式 a++, n--,雙重控制。
void main() {
int a = 0, n;
printf("\n input n: ");
scanf("%d", &n);
for (;;) {
a++; n--;
printf("%d ", a * 2);
if (n == 0) break;
}
}
等效於 while(1),若無 break 則為死循環。
#include <stdio.h>
void main() {
int n = 0;
printf("input a string:\n");
for (; getchar() != '\n'; n++);
printf("%d", n);
}
計數移至表達式3,循環體為空語句(僅一分號)。注意:空語句分號不可省,否則後續語句會被視為循環體;反之,循環體非空時,括號後加分號會導致循環體為空,造成邏輯錯誤。
for 可與 while、do-while 任意嵌套,常見形式:
(1) for() { ... while() {...} ... }
(2) do { ... for() {...} ... } while();
(3) while() { ... for() {...} ... }
(4) for() { ... for() {...} ... }
void main() {
int i, j, k;
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3 - i + 5; j++)
printf(" ");
for (k = 1; k <= 2 * i - 1 + 5; k++) {
if (k <= 5) printf(" ");
else printf("*");
}
printf("\n");
}
}
| 循環類型 | 判斷時機 | 最少執行次數 | 適用場景 |
|---|---|---|---|
| while | 先判斷後執行 | 0 | 循環次數未知,需先檢查條件 |
| do-while | 先執行後判斷 | 1 | 至少需執行一次,如選單輸入驗證 |
| for | 先判斷後執行 | 0 | 循環次數明確或需初始化/遞增的計數循環 |
靈活掌握三種循環,並注意邊界條件、死循環預防與巢狀結構設計,是編寫高效 C 程式的關鍵基礎。