循環是程序控制流的核心。本文系統講解 while、do-while、for 三種循環的語法、執行流程、差異對比、典型應用模式與嵌套技巧,附帶可直接運行的代碼片段。
// 語法
while (條件表達式) {
循環體;
}
特點:條件為真才執行,**可能零次執行**。
int i = 1;
while (i < 101) {
if (i % 7 == 0) printf("%d ", i);
i++;
}
printf("\n");
int number = 100;
while (number--) { // number 從 100 遞減至 1(0 時為假結束)
if (number % 7 == 0 && number) // 排除 0
printf("%d ", number);
}
#include // arc4random() 需 BSD/macOS,Linux 用 rand()
int n, number, max = 0, min = 70;
printf("請輸入 n: "); scanf("%d", &n);
while (n--) {
number = arc4random() % 41 + 30; // [30, 70]
printf("%d ", number);
if (number > max) max = number;
if (number < min) min = number;
}
printf("\nMax: %d, Min: %d\n", max, min);
// 語法
do {
循環體;
} while (條件表達式);
特點:**至少執行一次**,適合菜單、輸入驗證等場景。
int number = 0, attempts = 3;
do {
printf("請輸入密碼: "); scanf("%d", &number);
if (number == 123) {
printf("登陸成功!\n"); break;
} else {
if (--attempts > 0)
printf("密碼錯誤,剩餘 %d 次機會\n", attempts);
else
printf("賬戶凍結,48 小時後重試!\n");
}
} while (attempts > 0);
// 語法
for (初始化; 條件; 增量) {
循環體;
}
// 執行順序:1→2→4→3→2→4→3→...→2(假)→結束
int i=1)i<101)i++)// 7 的倍數
for (int i = 1; i < 101; i++) if (i % 7 == 0) printf("%d ", i);
printf("\n");
// 個位是 7
for (int i = 1; i < 101; i++) if (i % 10 == 7) printf("%d ", i);
printf("\n");
// 十位是 7
for (int i = 1; i < 101; i++) if (i / 10 == 7) printf("%d ", i);
printf("\n");
// 既非 7 的倍數,個十位也非 7
for (int i = 1; i < 101; i++)
if (i % 7 != 0 && i % 10 != 7 && i / 10 != 7)
printf("%d ", i);
| 特性 | while | do-while | for |
|---|---|---|---|
| 判斷時機 | 循環前 | 循環後 | 循環前 |
| 最少執行次數 | 0 | 1 | 0 |
| 適用場景 | 未知次數、條件複雜 | 菜單、至少一次 | 已知次數、計數遍歷 |
| 變量作用域 | 外部 | 外部 | C99 可在初始化處聲明,僅循環內可見 |
規則:外層執行一次,內層執行一遍。
for (int i = 1; i < 4; i++) { // 外層 3 次
for (int j = 1; j < 4; j++) { // 內層每次 3 次
printf("%d ", j); // 輸出 1 2 3
}
printf("\n"); // 換行
}
// 輸出:
// 1 2 3
// 1 2 3
// 1 2 3
break:立即跳出**當前層**循環。continue:跳過本次迭代剩餘代碼,直接進入下一次判斷/增量。goto:慎用,可跳出多層嵌套(配合標籤)。while(1))且內部無 break/返回。<= vs <)。for 循環體內修改計數器導致邏輯混亂。熟練掌握三種循環的語義差異與適用場景,配合 break/continue 靈活控制流程,是編寫高效、可讀 C 代碼的基礎功力。