模块二 · 流程与数据 / 第 07 课
07 · switch 多分支
学习目标
- 会用 switch 写菜单/选项
- 记住 break 的作用
- 会写 default 兜底
语法
当一个整数要对应多种固定取值时,switch 比一长串 if 更清楚。
#include <stdio.h>
int main(void)
{
int cmd = 2;
switch (cmd)
{
case 1:
printf("新建\n");
break;
case 2:
printf("打开\n");
break;
case 3:
printf("保存\n");
break;
default:
printf("无效命令\n");
break;
}
return 0;
}
忘写 break 会怎样
会继续往下执行后面的 case,直到遇到 break。这叫贯穿。初学阶段每个 case 都写 break,最安全。
有时故意合并:
switch (ch)
{
case 'y':
case 'Y': /* y 和 Y 同一处理 */
printf("确认\n");
break;
default:
break;
}
菜单循环(和后面项目衔接)
实际程序常把 switch 放进循环,反复显示菜单:
#include <stdio.h>
int main(void)
{
int cmd = -1;
while (cmd != 0)
{
printf("1新建 2打开 0退出\n");
scanf("%d", &cmd);
switch (cmd)
{
case 1: printf("新建...\n"); break;
case 2: printf("打开...\n"); break;
case 0: printf("退出\n"); break;
default: printf("无效\n"); break;
}
}
return 0;
}
switch vs if,怎么选
| 场景 | 推荐 |
|---|---|
| 离散选项:1/2/3、'y'/'n' | switch 更清晰 |
| 区间:score >= 60 且 < 80 | 用 if |
| 复杂逻辑组合 | 用 if |
小例子:用 switch 做四则运算
读两个数和一个运算符(+ - * /),输出结果。注意除零要单独判:
#include <stdio.h>
int main(void)
{
double a, b, r = 0;
char op;
printf("例如: 12 + 5\n");
if (scanf("%lf %c %lf", &a, &op, &b) != 3)
{
printf("输入格式不对\n");
return 1;
}
switch (op)
{
case '+': r = a + b; break;
case '-': r = a - b; break;
case '*': r = a * b; break;
case '/':
if (b == 0)
{
printf("除数不能为 0\n");
return 1;
}
r = a / b;
break;
default:
printf("不支持的运算符 %c\n", op);
return 1;
}
printf("%.2lf %c %.2lf = %.2lf\n", a, op, b, r);
return 0;
}
单片机场景 · switch:按键选择模式
按键编号是离散值,适合 switch。每个分支用 break 防止意外继续执行。
边界与验证:key、step 需事先声明。这里只处理已识别的按键编号;扫描、去抖和有效电平取决于硬件。
switch (key) {
case 1: step = 1; break;
case 2: step = 2; break;
default: step = 0; break;
}
本课过关
必做case 后面能写变量吗?
逐步解析
switch 在编译期往往被优化成跳转表或一串比较,所以 case 后面必须是编译时就能确定的常量(字面量、枚举、#define),不能是运行时才有的变量。写 case n:(n 是变量)会直接编译错误。若你需要「某个变量等于某变量」这类运行时比较,请用 if。另外 case 之间没有隐式间隔:不写 break 会落入下一个 case,这是「贯穿」行为。
必做作业
- 用 switch 实现:1 打印一,2 打印二,3 打印三,其它打印「无」。
- 为什么 case 1: case 2: 可以叠在一起?
- 把上面菜单改成:只有输入 1/2/0 才执行,其它提示并重新输入。
先自己写完,再点开看解答
1:
int n;
scanf("%d", &n);
switch (n) {
case 1: printf("一\n"); break;
case 2: printf("二\n"); break;
case 3: printf("三\n"); break;
default: printf("无\n"); break;
}2:两个 case 都不写 break 的中间语句时,会落入同一段代码,实现「或」语义。
3:default 里不要改 cmd,直接提示,外层 while 条件保持 cmd!=0 即可再次循环。
学完去哪
下一课:重复做事用循环。