流程控制是程式設計的核心骨架,決定了程式碼的執行順序與邏輯走向。在 C 語言中,主要分為「分支語句」與「迴圈語句」兩大類。掌握它們的語法細節、執行機制與常見陷阱,能讓你寫出更健壯、高效的程式。本文將系統整理 if/else、switch/case、for、while、do-while 的用法,並搭配實戰範例與注意事項,助你建立扎實的控制流基礎。
if/else 是最基礎、也是最常用的條件判斷語句。其基本骨架如下:
if (邏輯表達式條件1) {
// 滿足條件1 時執行的語句
} else if (邏輯表達式條件2) {
// 滿足條件2 時執行的語句
} else {
// 以上條件都不滿足時執行的語句
}
if/else 鏈條只會執行其中一個分支。一旦某分支條件成立,後續分支皆被跳過。若執行到第 n 個分支,意味著前 n-1 個條件皆為假。else 的結構「必選其一」執行;無 else 則為「可選其一」。{} 可省略。但涉及 break、continue、return 等跳轉語句時,習慣上仍建議保留大括號以提升可讀性。int a;
scanf("%d", &a);
if (a > 0) {
printf("%d 是正數\n", a);
} else if (a == 0) {
printf("%d 是零\n", a);
} else {
printf("%d 是負數\n", a);
}
#include <stdio.h>
int main() {
int y, m, maxDay = 31;
printf("請輸入年 月:");
scanf("%d%d", &y, &m);
if (m < 1 || m > 12) {
printf("輸入非法\n");
return -1;
}
if (m == 4 || m == 6 || m == 9 || m == 11) {
maxDay = 30;
} else if (m == 2) {
// 閏年規則:能被 4 整除但不能被 100 整除,或能被 400 整除
maxDay = 28 + ((y % 4 == 0 && y % 100 != 0) || (y % 400 == 0));
}
printf("%d 年 %d 月有 %d 天\n", y, m, maxDay);
return 0;
}
當需針對同一整數型表達式進行多值比對時,switch 結構更清晰:
switch (控制表達式) {
case 常量表達式1: 語句; break;
case 常量表達式2: 語句; break;
...
default: 語句;
}
char),不可為浮點數或字串。3、'A'、2+5),且值不可重複。case 開始向下執行,直到遇到 break 或結束大括號。若省略 break,會「貫穿」執行後續 case。int a = 2;
switch (a) {
case 1: printf("選項 1\n"); break;
case 2: printf("選項 2\n"); break;
case 3: printf("選項 3\n"); break;
default: printf("無效選項\n");
}
for (初始化語句1; 條件判斷2; 步進語句3) {
// 迴圈體 4
}
執行順序: 1 → 2(真) → 4 → 3 → 2(真) → 4 → 3 → … → 2(假) → 結束。
// 固定次數
for (int i = 0; i < 10; i++) {
printf("%d ", i);
}
// 死循環(無限循環)
for (;;) { /* 需配合 break 退出 */ }
// C99 支援在迴圈內宣告變數:for (int i = 0; ...)
#include <stdio.h>
int main() {
int sum = 0, max = 0x80000000, num = 0, temp;
for (;;) {
scanf("%d", &temp);
if (temp == -1) break;
sum += temp;
if (temp > max) max = temp;
num++;
}
printf("總分=%d, 平均=%.2f, 最高分=%d\n", sum, 1.0 * sum / num, max);
return 0;
}
初始化;
while (條件) {
迴圈體;
步進;
}
與 for 互通,語意上更強調「當條件成立時持續執行」。
int sum = 0, temp;
while (1) {
printf("請輸入數字(0 結束):");
scanf("%d", &temp);
if (temp == 0) break;
sum += temp;
}
printf("總和 = %d\n", sum);
初始化;
do {
迴圈體;
步進;
} while (條件); // 注意分號
適用於「先執行再判斷」的場景,如選單顯示、輸入驗證。
int num, count = 0;
printf("請輸入一個整數:");
scanf("%d", &num);
do {
num /= 10;
count++;
} while (num != 0);
printf("位數:%d\n", count);
| 關鍵字 | 作用範圍 | 行為 |
|---|---|---|
break | 迴圈 / switch | 立即跳出所在層迴圈或 switch;若為巢狀迴圈,僅跳出內層。 |
continue | 迴圈內部 | 結束本次迴圈,直接進入下一次條件判斷。 |
return | 函數 | 結束整個函數,返回調用處。 |
巢狀迴圈常用於多維資料處理或圖形列印。內層迴圈次數控制的通用公式(外層 i 從 0 起始,步進 1):
j < m * i + n
m:內層每輪遞增量(遞減取負)n:內層第一輪執行次數for (int i = 0; i < 5; i++) {
for (int j = 0; j < 2 * i + 1; j++) printf("*");
printf("\n");
}
for (int i = 1; i < 10; i++) {
for (int j = 1; j <= i; j++) {
printf("%d*%d=%-3d ", j, i, j * i);
}
printf("\n");
}
for、條件前置用 while、至少一次用 do-while、多值比對用 switch。for(;;) 或 while(1) 缺乏 break。break/continue 簡化邏輯: 但避免過度使用導致流程難以追蹤。i/row,內層 j/col。-Wall -Wextra,捕捉條件判斷常量、變數未初始化等隱患。熟練掌握流程控制,是邁向演算法與系統程式設計的基石。建議動手修改上述範例,觀察不同輸入下的行為差異,將知識內化為肌肉記憶。