C 語言提供三種循環結構,各有適用場景:
| 類型 | 判斷時機 | 最少執行次數 | 典型用途 |
|---|---|---|---|
while | 迴圈前 | 0 次 | 次數未知、條件複雜的迴圈 |
do-while | 迴圈後 | 1 次 | 選單輸入、至少執行一次的邏輯 |
for | 迴圈前 | 0 次 | 已知次數、計數器驅動的迴圈 |
while (表達式) {
循環體語句;
}
int i = 1, sum = 0;
while (i <= 100) {
sum += i;
i++;
}
printf("sum=%d\n", sum); // 5050
關鍵:變數 `i`、`sum` **必須初始化**;循環體內**必須有趨向結束的語句**(`i++`),否則無限迴圈。
int a, x;
long sum = 0, tn = 0, n = 1;
scanf("%d%d", &a, &x); // 例:a=2, x=3 → 2+22+222
tn = a;
while (n <= x) {
sum += tn;
tn = tn * 10 + a; // 關鍵遞推:2 → 22 → 222
n++;
}
printf("result is %ld", sum);
do {
循環體語句;
} while (表達式);
**先執行一次**,再判斷條件。適合「至少一次」場景(如選單顯示)。
int i = 2, sum = 0;
do {
sum += i;
i += 2;
} while (i <= 100);
printf("sum=%d\n", sum); // 2550
int i = 101;
while (i <= 100) { printf("while 執行\n"); } // 0 次
do { printf("do-while 執行\n"); } while (i <= 100); // 1 次
for (表達式1; 表達式2; 表達式3)
循環體;
int sum = 0;
for (int i = 1; i <= 100; i++)
sum += i;
printf("sum=%d", sum);
// 1. 多變數控制
for (int i = 0, j = 10; i < j; i++, j--) { ... }
// 2. 省略表達式(分號不可省)
int i = 1;
for (; i <= 10; ) { printf("%d ", i++); }
// 3. 條件與更新合併
for (int i = 1; i <= 100; sum += i, i++); // 循環體為空
// 4. 判斷質數(旗標變數應用)
int n, m, flag = 1;
scanf("%d", &n);
for (m = 2; m < n && flag; m++)
if (n % m == 0) flag = 0;
printf(flag ? "%d is prime" : "%d not prime", n);
for (int i = 0; i < 10; i++) {
printf("%d ", i);
if (i == 3) break; // 輸出 0 1 2 3 後跳出
}
應用:優化質數判斷——發現因數即 `break`,無需跑完迴圈。
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) continue; // 跳過偶數
printf("%d ", i); // 僅輸出奇數 1 3 5 7 9
}
練習:求 1000 內能被 3、5、7 整除的數(提示:`if (!(i%3==0||i%5==0||i%7==0)) continue;`)。
int i = 1, s = 0;
loop:
if (i <= 100) {
s += i;
i++;
goto loop; // 等價於 while/for,但破壞結構化
}
printf("1+...+100=%d", s);
合理場景:多層巢狀迴圈需一次跳出最外層(需配合標號),或錯誤處理統一跳轉至清理區塊。
| 錯誤模式 | 後果 | 修正 |
|---|---|---|
| 循環變數未初始化 | 行為未定義 | 宣告時賦值 `int i=0;` |
| 缺少趨向結束語句 | 無限迴圈 | 檢查 `i++`、指標移動等 |
| `scanf` 失敗未清緩衝區 | 死循環讀同一錯誤輸入 | 檢查回傳值,失敗時 `while(getchar()!='\n');` |
| 巢狀迴圈誤用 `break` | 僅跳出內層 | 用旗標變數或 `goto` 跳出多層 |
| `continue` 用在 `switch` 非迴圈中 | 編譯錯誤 | `continue` 僅限迴圈 |
循環是程式「重複執行」的引擎。while 適合條件驅動,do-while 保證首次執行,for 專為計數設計;break/continue 賦予流程細粒度控制,goto 為特殊情況留後門。掌握三者轉換與組合,並養成「初始化→條件→迭代」的肌肉記憶,是寫出高效、可讀 C 代碼的基石。