C 语言书
模块二 · 流程与数据 / 第 07 课

07 · switch 多分支

入门 25 分钟 跳到过关题
学习目标
  • 会用 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 后面能写变量吗?

必做作业
  1. 用 switch 实现:1 打印一,2 打印二,3 打印三,其它打印「无」。
  2. 为什么 case 1: case 2: 可以叠在一起?
  3. 把上面菜单改成:只有输入 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 即可再次循环。