在 C 语言中,switch语句是一种多分支选择结构,用于根据表达式的值从多个分支中选择一个执行,比if-else if结构在多分支场景下更简洁高效。以下是其基本概要:
1. 语法结构
switch (表达式) {
case 常量表达式1:
语句块1;
break; // 可选,用于跳出switch
case 常量表达式2:
语句块2;
break;
// ... 更多case分支
default: // 可选,当所有case都不匹配时执行
语句块n;
break;
}
2. 核心要点
-
表达式要求:
switch后的表达式结果必须是整数类型(int、char、枚举等,不能是 float、double 等非整数类型)。 -
case 常量:
case后的 “常量表达式” 必须是整数常量(如1、'a'、枚举值),且不能重复。 -
执行逻辑:
- 计算
switch表达式的值。 - 与各个
case的常量比较,匹配则从该case后的语句开始执行。 - 若没有
break,会继续执行后续case的语句(“穿透” 现象),直到遇到break或switch结束。
- 计算
-
default 分支:可选,当所有
case都不匹配时执行;通常放在最后,也可放其他位置(需加break避免穿透)。
3. 示例
#include <stdio.h>
int main() {
int num = 2;
switch (num) {
case 1:
printf("One\n");
break; // 执行后跳出switch
case 2:
printf("Two\n"); // 匹配此case,执行
// 无break,继续穿透到下一个case
case 3:
printf("Three\n"); // 会被执行
break; // 跳出switch
default:
printf("Other\n");
}
return 0;
}
输出:
case 的值要与 表达式的值完全一样, 才是匹配成功!
如果匹配成功,就执行对应代码,直到遇到break为止!
考试分数
#include <stdio.h>
int main(){
printf("switch");
// 考试分数
int score = 61;
// case 的值要与 表达式的值完全一样, 才是匹配成功!
// if(score >= 60 && score <=70)
switch(score){
case 60:
printf("额外做1张试卷");
break;
case 61:
printf("额外做1张试卷");
break;
case 70:
printf("额外做半张试卷");
break;
case 90:
printf("出去玩");
break;
default:
printf("你考的分数不在处理范围");
break;
}
}
输出
一周行动表
#include <stdio.h>
int main () {
int day;
printf("输入1-7的数字,获取我的工作日历:");
scanf("%d", &day);
switch(day){
case 1:
printf("有课,逃课出去玩");
break;
case 2:
printf("有课,逃课打球");
break;
case 3:
printf("逃课被抓,老实上课");
break;
case 4:
printf("依旧逃课骑着小电驴打流");
break;
case 5:
printf("被导员请喝茶");
break;
case 6:
printf("放假奢侈一把");
break;
case 7:
printf("放假睡一天");
break;
default:
printf("输入有误,没有这个日历");
break;
}
}
输出
witch适合分支条件为离散整数的场景,相比if-else if更清晰,执行效率也更高(底层通常通过跳转表实现)。
作业
#include <stdio.h>
int main() {
int month, year;
printf("请输入月份:");
scanf("%d", &month);
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
printf("31\n");
break;
case 4:
case 6:
case 9:
case 11:
printf("30\n");
break;
case 2:
printf("请输入年份:");
scanf("%d", &year);
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
printf("29\n");
} else {
printf("28\n");
}
break;
default:
printf("输入的月份无效,请输入1-12之间的整数\n");
}
return 0;
}