作业介绍
switch 语句
switch 语句是信奥赛中常用的多分支选择结构,核心作用是:根据一个「整型 / 字符型表达式」的结果,快速跳转到对应的分支执行代码,比多层 if-else 更简洁高效,尤其适合 “判断固定值匹配” 的场景(如菜单选择、状态判断、题目条件分支等)。
一、核心结构
switch (表达式) {
case 常量1:
语句块1;
break; // 可选,但几乎必用(跳出switch)
case 常量2:
语句块2;
break;
// ... 更多case
default: // 可选(所有case不匹配时执行)
语句块n;
// 可加break,也可不加(默认执行完跳出)
}
各部分说明(高频考点)
-
表达式要求:只能是「整型」或「字符型」(信奥常考 int、char),不能是 float、double、字符串(如
"abc")!✅ 合法:
switch(a)(a 是 int)、switch(c)(c 是 char)❌ 非法:
switch(3.14)、switch("yes") -
case 后面的 “常量”:必须是「字面常量」(如 1、'A')或「宏定义的常量」(如
#define NUM 5),不能是变量(如case x:)!✅ 合法:
case 0:、case 'B':、case MAX:(MAX 是宏定义)❌ 非法:
case a:(a 是 int 变量) -
break 语句:作用是「跳出整个 switch 结构」,如果省略,会触发「穿透效应」(继续执行下一个 case 的代码,直到遇到 break 或 switch 结束)。
-
default 分支:可选,位置不固定(可在所有 case 前 / 后),当表达式结果和所有 case 都不匹配时执行,相当于 “兜底方案”。
二、核心规则(易错点)
1. 穿透效应(重点 + 易错点)
-
什么是穿透?:case 后没有 break 时,执行完当前 case 的代码后,会不判断下一个 case 的常量,直接执行下一个 case 的语句块。
-
示例(错误示范):
int a = 2;
switch(a) {
case 1: printf("1"); // 不执行
case 2: printf("2"); // 执行(a=2匹配)
case 3: printf("3"); // 穿透执行(无break)
default: printf("default"); // 继续穿透
}
// 输出结果:23default(不是只输出2!)
- 何时用穿透?:需要多个 case 执行相同代码时(精简写法),例如:
// 输入1-3输出“及格”,4-5输出“优秀”
int score = 2;
switch(score) {
case 1:
case 2:
case 3: printf("及格"); break; // 1、2、3共用同一逻辑
case 4:
case 5: printf("优秀"); break; // 4、5共用同一逻辑
}
2. 分支顺序不影响匹配(但建议按逻辑排序)
case 的顺序可以任意调整(比如把 default 放在最前面),但匹配规则不变:只看 “表达式结果是否等于 case 常量”,和顺序无关。
⚠️ 注意:如果 default 放在前面且没有 break,会先执行 default,再穿透后面的 case(不推荐这么写,易出错)。
3. 数据类型必须严格匹配
-
字符型 char 本质是 “ASCII 码整型”,所以
case 'A'等价于case 65('A' 的 ASCII 码是 65),但注意区分大小写('A'≠'a',65≠97)。 -
示例(字符型匹配):
char c = 'B';
switch(c) {
case 'A': printf("A"); break;
case 'B': printf("B"); break; // 执行
case 'C': printf("C"); break;
}
三、信奥赛常见用法(实战场景)
场景 1:菜单选择(最经典)
比如编程题中 “输入 1 执行功能 A,输入 2 执行功能 B”:
#include <stdio.h>
int main() {
int choice;
printf("1. 求平方 2. 求立方 3. 退出\n");
scanf("%d", &choice);
switch(choice) {
case 1:
int x; scanf("%d", &x); printf("平方:%d\n", x*x);
break;
case 2:
int y; scanf("%d", &y); printf("立方:%d\n", y*y*y);
break;
case 3:
printf("退出程序\n");
break;
default:
printf("输入错误!\n"); // 兜底处理非法输入
}
return 0;
}
场景 2:条件分类(替代多层 if-else)
比如 “根据成绩等级(A-E)输出分数范围”:
char grade = 'B';
switch(grade) {
case 'A': printf("90-100\n"); break;
case 'B': printf("80-89\n"); break;
case 'C': printf("70-79\n"); break;
case 'D': printf("60-69\n"); break;
case 'E': printf("0-59\n"); break;
default: printf("等级无效\n");
}
场景 3:状态机判断(信奥进阶)
比如模拟游戏角色状态(0 = 待机,1 = 移动,2 = 攻击):
int status = 1;
switch(status) {
case 0: printf("待机中...\n"); break;
case 1: printf("移动中...\n"); break;
case 2: printf("攻击!\n"); break;
}
四、必避坑点(易错真题总结)
-
❌ 表达式用了浮点型(如
switch(3.5)):直接编译错误,信奥题中若有 “分数判断”,需先转为整型(如switch((int)score))。 -
❌ case 后写变量(如
case x:):编译错误,必须是常量。 -
❌ 忘记加 break 导致穿透:比如题目要求 “输入 1 输出 A,输入 2 输出 B”,没加 break 会输出 AB,这是信奥题中最常见的扣分点!
-
❌ 字符串匹配(如
switch("abc")):C/C++ 中 switch 不支持字符串,需用 if-else 或 strcmp 函数判断。 -
❌ default 位置错误导致穿透:比如把 default 放在 case 前且无 break,会先执行 default 再执行后面的 case。
五、switch vs if-else(信奥选择技巧)
| 对比维度 | switch 语句 | if-else 语句 |
|---|---|---|
| 适用场景 | 表达式是固定整型 / 字符常量 | 条件是范围(如 x>10)、多种类型 |
| 代码简洁度 | 多分支时更简洁(少写条件) | 少分支时更灵活 |
| 执行效率 | 更高(直接跳转到对应 case) | 依次判断,效率较低 |
| 信奥选择建议 | 固定值匹配(如菜单、等级) | 范围判断(如 x>5 && x<10) |
✅ 信奥题口诀:固定值用 switch,范围判断用 if-else。
总结(核心记忆点)
-
结构:
switch(整型/字符表达式) → case常量 → break → default; -
关键:break 防穿透,case 必须是常量,表达式不能是浮点 / 字符串;
-
用法:菜单、分类、状态判断,多分支时比 if-else 更高效简洁;
-
易错:漏 break、表达式类型错误、case 用变量。
题目
- 状态
- 正在进行…
- 题目
- 5
- 开始时间
- 2025-12-15 0:00
- 截止时间
- 2035-11-28 23:59
- 可延期
- 24 小时