當面對多個離散常量值的判斷時,if-else if 鏈條會顯得冗長。C語言提供 switch 開關語句 專門解決此類問題,語法結構清晰,執行效率高。
switch(表達式) {
case 常量表達式1: 語句序列1; break;
case 常量表達式2: 語句序列2; break;
...
case 常量表達式n: 語句序列n; break;
default: 語句序列n+1;
}
執行語義: 計算表達式值,依序與各 case 常量比較。匹配成功則從該 case 開始執行,若無 break 則會「貫穿」繼續執行後續所有 case 語句,直到遇到 break 或 switch 結束。若全不匹配則執行 default(可省略)。
輸入數字 1~7 輸出對應英文星期:
// 錯誤版:缺少 break,輸入 3 會輸出 Wednesday 到 Sunday 及 error
switch(a) {
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
...
default: printf("error\n");
}
// 正確版:每個 case 後加 break
switch(a) {
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
...
default: printf("error\n");
}
核心區別: case 只是標號,不具備自動跳出功能,這與 if-else 互斥執行截然不同,必須靠 break 顯式跳出。
case 常量值必須互不相同,否則編譯報錯。case 可包含多條語句,無需大括號 直接書寫。case 与 default 順序可任意調換,不影響結果(但習慣把 default 放最後)。default 子句可省略;省略後若無匹配則不執行任何操作。四則運算計算器:利用 switch 判斷運算符 + - * /,輸出結果,默認提示錯誤。
float a, b; char op;
scanf("%f %c %f", &a, &op, &b);
switch(op) {
case '+': printf("%f", a+b); break;
case '-': printf("%f", a-b); break;
case '*': printf("%f", a*b); break;
case '/': printf("%f", a/b); break;
default: printf("input error");
}
三數求最大最小值:先比較 a、b 存入 max/min,再與 c 比較更新,邏輯簡潔高效。
循環結構在條件成立時反覆執行循環體,直到條件不成立。C語言提供 while、for、do-while 三種循環。
while(表達式) 語句;
// 表達式為真(非0)執行循環體,假則退出
int n = 0;
printf("input a string:\n");
while(getchar() != '\n') n++;
printf("%d", n);
循環條件 getchar() != '\n' 表示未遇回車持續循環,循環體 n++ 計數。
while(n--) 實現固定次數循環。{} 括起。while(a=5) 恆真且循環體無修改 a,將無限執行。while 循環體內再含 while,形成多重循環。掌握 switch 的「貫穿」特性與 break 用法,結合 while 循環的靈活判斷,能讓你輕鬆應對多分支選擇與不定次數重複執行的編程場景。