作业介绍

switch 语句

switch 语句是信奥赛中常用的多分支选择结构,核心作用是:根据一个「整型 / 字符型表达式」的结果,快速跳转到对应的分支执行代码,比多层 if-else 更简洁高效,尤其适合 “判断固定值匹配” 的场景(如菜单选择、状态判断、题目条件分支等)。

一、核心结构

switch (表达式) {

    case 常量1:

        语句块1;

        break;  // 可选,但几乎必用(跳出switch)

    case 常量2:

        语句块2;

        break;

    // ... 更多case

    default:  // 可选(所有case不匹配时执行)

        语句块n;

        // 可加break,也可不加(默认执行完跳出)

}

各部分说明(高频考点)

  1. 表达式要求:只能是「整型」或「字符型」(信奥常考 int、char),不能是 float、double、字符串(如"abc")!

    ✅ 合法:switch(a)(a 是 int)、switch(c)(c 是 char)

    ❌ 非法:switch(3.14)switch("yes")

  2. case 后面的 “常量”:必须是「字面常量」(如 1、'A')或「宏定义的常量」(如#define NUM 5),不能是变量(如case x:)!

    ✅ 合法:case 0:case 'B':case MAX:(MAX 是宏定义)

    ❌ 非法:case a:(a 是 int 变量)

  3. break 语句:作用是「跳出整个 switch 结构」,如果省略,会触发「穿透效应」(继续执行下一个 case 的代码,直到遇到 break 或 switch 结束)。

  4. 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;

}

四、必避坑点(易错真题总结)

  1. ❌ 表达式用了浮点型(如switch(3.5)):直接编译错误,信奥题中若有 “分数判断”,需先转为整型(如switch((int)score))。

  2. ❌ case 后写变量(如case x:):编译错误,必须是常量。

  3. ❌ 忘记加 break 导致穿透:比如题目要求 “输入 1 输出 A,输入 2 输出 B”,没加 break 会输出 AB,这是信奥题中最常见的扣分点!

  4. ❌ 字符串匹配(如switch("abc")):C/C++ 中 switch 不支持字符串,需用 if-else 或 strcmp 函数判断。

  5. ❌ default 位置错误导致穿透:比如把 default 放在 case 前且无 break,会先执行 default 再执行后面的 case。

五、switch vs if-else(信奥选择技巧)

对比维度 switch 语句 if-else 语句
适用场景 表达式是固定整型 / 字符常量 条件是范围(如 x>10)、多种类型
代码简洁度 多分支时更简洁(少写条件) 少分支时更灵活
执行效率 更高(直接跳转到对应 case) 依次判断,效率较低
信奥选择建议 固定值匹配(如菜单、等级) 范围判断(如 x>5 && x<10)

✅ 信奥题口诀:固定值用 switch,范围判断用 if-else

总结(核心记忆点)

  1. 结构:switch(整型/字符表达式) → case常量 → break → default

  2. 关键:break 防穿透,case 必须是常量,表达式不能是浮点 / 字符串;

  3. 用法:菜单、分类、状态判断,多分支时比 if-else 更高效简洁;

  4. 易错:漏 break、表达式类型错误、case 用变量。

题目

认领作业后才可以查看作业内容。
状态
正在进行…
题目
5
开始时间
2025-12-15 0:00
截止时间
2035-11-28 23:59
可延期
24 小时