目錄
一、switch語句基礎
基本語法結構:
在C/C++中:
注意事項:
二、if與switch語句對比
示例:計算整數除以3的余數
使用if語句實現:
使用switch語句實現:
三、break語句的作用
示例(無break的情況):
練習:輸入1-7的數字,輸出對應的星期名稱
參考代碼:
需求變更后:
修改后的參考代碼:
四、default子句
五、注意事項
一、switch語句基礎
????????除了if語句外,C語言還提供了switch語句來實現分支結構。switch語句是一種特殊形式的if-else結構,專門用于處理多條件分支的情況,它能夠將復雜的else-if結構轉換為更易用、可讀性更好的形式。
基本語法結構:
switch (expression) {case value1: statement1;break;case value2: statement2;break;...default: default_statement;break;
}
????????上述代碼根據 expression 的不同取值執行對應的 case 分支。若未匹配到任何值,則執行 default 分支。
????????在大多數編程語言中,switch
?語句的?case
?標簽右邊的值(value)通常是?整型(int)?或可以隱式轉換為整型的類型(如?char
、enum
),但具體規則取決于語言。
在C/C++中:
-
case
?值必須是整型常量表達式(如?int
、char
、enum
)。 -
字符類型(char)也是歸類到整型家族,因為字符的本質ASCII碼值,這個值是整數。
-
不允許字符串、浮點數或變量(C++11 后允許?
constexpr
)。switch (x) {case 1: // 合法(整型)case 'a': // 合法(char 隱式轉 int)case ENUM_VAL: // 合法(enum 隱式轉 int)// case 1.5: // 非法(浮點數)break; }
注意事項:
-
switch
后的表達式(expression)必須是整型表達式 -
case
后的值必須是整型常量表達式 -
case
和值之間必須有空格 -
每個
case
語句執行完畢后通常需要添加break
以跳出switch結構
二、if與switch語句對比
示例:計算整數除以3的余數
使用if語句實現:
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);if(n%3 == 0)printf("整除,余數為0\n");else if(n%3 == 1)printf("余數是1\n");elseprintf("余數是2\n");return 0;
}
使用switch語句實現:
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余數為0\n"); break;case 1:printf("余數是1\n"); break;case 2:printf("余數是2\n"); break;}return 0;
}
在編寫代碼時,需要注意以下關鍵點:
- case關鍵字與后續數字之間必須保留空格
- 每個case語句塊執行完畢后,必須添加break語句才能正確退出switch結構
三、break語句的作用
????????在switch語句中,break
用于終止當前case的執行并跳出整個switch結構。如果省略break,程序會繼續執行下一個case中的語句,這種現象稱為"case穿透"。
示例(無break的情況):
#include <stdio.h>
int main() {int n = 0;scanf("%d", &n);switch(n%3) {case 0:printf("整除,余數為0\n"); case 1:printf("余數是1\n"); case 2:printf("余數是2\n"); }return 0;
}
當輸入7時(7%3=1),輸出將是:
????????我們發現程序在計算7除以3時,本該顯示余數為1,但運行結果卻多輸出了"余數是2"的信息。這到底是什么原因呢?
????????問題出在switch語句的分支機制上。switch語句需要配合break才能實現真正的分支效果。當某個case語句后缺少break時,程序會繼續向下執行,可能進入其他case的代碼塊,直到遇到break或switch語句結束。例如在上述代碼中,程序就意外執行了case 2的語句。
????????因此,在switch語句中合理使用break至關重要,它能確保正確的分支控制。不過需要注意的是,并非每個case都必須包含break,這需要根據具體業務邏輯來決定。
練習:輸入1-7的數字,輸出對應的星期名稱
示例: 輸入1 → 輸出"星期一" ;輸入2 → 輸出"星期二" ;輸入3 → 輸出"星期三" ;輸入4 → 輸出"星期四" ;輸入5 → 輸出"星期五" ;輸入6 → 輸出"星期六" ;輸入7 → 輸出"星期天"
參考代碼:
#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1: printf("星期一\n"); break;case 2: printf("星期二\n"); break;case 3: printf("星期三\n"); break;case 4: printf("星期四\n"); break;case 5: printf("星期五\n"); break;case 6: printf("星期六\n"); break;case 7: printf("星期天\n"); break;}return 0;
}
需求變更后:
- 輸入1-5時輸出"工作日"
- 輸入6-7時輸出"休息日"
修改后的參考代碼:
#include <stdio.h>
int main() {int day;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5: printf("工作日\n"); break;case 6:case 7: printf("休息日\n"); break;}return 0;
}
????????通過這個練習可以看出,在實際編碼時需要根據具體需求來決定break語句的使用位置,這樣才能正確實現功能需求。
四、default子句
????????當switch表達式的值與所有case都不匹配時,會執行default子句中的代碼。default不是必須的,但建議總是包含它以處理意外情況。
switch (expression)
{
case value1:statement;break;
case value2:statement;break;
default:statement;
}
當 expression 的值既不是 value1 也不是 value2 時,程序將執行 default 子句中的代碼。
????????比如之前的打印星期練習,當輸入的 day 值不在1到7范圍內時,若要提示"輸入錯誤",可以這樣編寫代碼:
#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:printf("星期一\n");break;// ... 其他星期 ...case 7:printf("星期天\n");break;default:printf("輸入錯誤,請輸入1-7的數字\n");break;}return 0;
}
工作日與休息日判斷:
#include <stdio.h>
int main() {int day = 0;scanf("%d", &day);switch(day) {case 1:case 2:case 3:case 4:case 5:printf("工作日\n");break;case 6:case 7:printf("休息日\n");break;default:printf("輸入錯誤\n");break;}return 0;
}
五、注意事項
-
case和default的順序可以任意排列,但通常將default放在最后
-
case穿透有時是有意為之(如上面的工作日示例),但大多數情況下需要添加break
-
switch語句只能處理離散的整數值,不能處理范圍判斷(如x > 10)
-
多個case可以共享同一組執行語句
通過合理使用switch語句,可以使多分支結構的代碼更加清晰、易于維護。