Switch Case语句在C语言中如何高效使用?

99ANYc3cd6
预计阅读时长 15 分钟
位置: 首页 C语言 正文

什么是 switch 语句?

switch 语句是一种多路分支语句,它根据一个变量的值来决定执行哪一段代码,你可以把它想象成一个多路开关,根据你传入的“信号”(变量值),接通对应的“线路”(执行代码块)。

switch case语句c语言
(图片来源网络,侵删)

它通常用于替代多个 if-else if-else 语句,当需要检查同一个变量是否等于多个不同值时,switch 语句会使代码更清晰、更易读。


switch 语句的基本语法

switch (expression) {
    case constant1:
        // 当 expression 的值等于 constant1 时,执行这里的代码
        break;
    case constant2:
        // 当 expression 的值等于 constant2 时,执行这里的代码
        break;
    case constant3:
        // 当 expression 的值等于 constant3 时,执行这里的代码
        break;
    default:
        // 当 expression 的值不匹配任何一个 case 时,执行这里的代码
        break;
}

语法详解:

  1. switch (expression):

    • switch 是关键字。
    • expression 是一个整型表达式(包括 int, char, short, long 等,C99标准后也支持 long long)。注意:float, double, string 等类型不能直接用于 switch
    • 这个表达式的值会与下面每个 case 后面的常量进行比较。
  2. case constant::

    • case 是关键字。
    • constant 必须是一个常量或常量表达式(不能是变量),1, 'A', 10 + 20,它的类型必须和 switchexpression 类型兼容。
    • expression 的值与某个 caseconstant 相等,程序就会从这个 case 的标签()之后开始执行代码。
  3. break;:

    switch case语句c语言
    (图片来源网络,侵删)
    • 这是 switch 语句中极其重要的一部分!
    • break 语句的作用是立即跳出整个 switch 语句,防止程序继续执行下一个 case 中的代码。
    • 如果省略了 break,程序会“穿透”(fall-through)到下一个 case 中继续执行,直到遇到一个 break 语句或者 switch 语句的结束大括号 ,这有时是故意的(见下面的“特性”部分),但大多数情况下是疏忽导致的 bug。
  4. default::

    • default 是可选的,但强烈推荐使用。
    • expression 的值不匹配任何一个 case 后面的常量,程序就会执行 default 标签下的代码。
    • 它类似于 if-else 结构中的 else 部分,通常放在 switch 语句的最后。

一个简单的例子

这个例子根据一个学生的分数(简化为1-5分)来评定等级。

#include <stdio.h>
int main() {
    int score = 3; // 假设学生得了3分
    switch (score) {
        case 5:
            printf("优秀!\n");
            break;
        case 4:
            printf("良好!\n");
            break;
        case 3:
            printf("及格!\n");
            break;
        case 2:
        case 1: // 可以合并多个 case,执行相同的代码
            printf("不及格!\n");
            break;
        default:
            printf("无效的分数!\n");
            break;
    }
    return 0;
}

执行结果:

及格!

代码分析:

switch case语句c语言
(图片来源网络,侵删)
  1. score 的值是 3
  2. switch 语句开始匹配,case 5 不匹配,case 4 不匹配。
  3. case 3 匹配成功,程序开始执行 printf("及格!\n");
  4. 遇到 break; 语句,程序立即跳出 switch 结构,main 函数结束。

switch 的核心特性:case 穿透

这是 switch 语句一个非常重要的特性,也是初学者最容易出错的地方。

case 分支中没有 break 语句,程序会继续执行下一个 case 的代码,而不会进行新的匹配。

例子:

#include <stdio.h>
int main() {
    int day = 2;
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            // 没有 break!
        case 3:
            printf("星期三\n");
            break;
        default:
            printf("其他日期\n");
            break;
    }
    return 0;
}

执行结果:

星期二
星期三

代码分析:

  1. day 的值是 2
  2. case 2 匹配成功,执行 printf("星期二\n");
  3. 因为没有 break,程序没有跳出 switch,而是继续向下执行。
  4. 它没有检查 case 3 是否匹配,而是直接执行了 case 3 的代码 printf("星期三\n");
  5. 然后遇到 break,跳出 switch

何时会用到“穿透”?

虽然大多数情况下 break 是必需的,但有时“穿透”特性是有用的,在之前的分数例子中,case 2case 1 需要执行相同的代码。

case 2:
case 1:
    printf("不及格!\n");
    break;

score21 时,都会执行 printf 语句。


switch vs. if-else if-else

如何选择使用哪个?

特性 switch 语句 if-else if-else 语句
判断条件 只能判断一个整型表达式的离散值 可以判断任意类型的表达式(如 x > 5, strcmp(s1, s2) == 0),可以进行范围判断。
可读性 当需要判断多个离散值时,代码结构更清晰,可读性更高。 判断条件复杂或较少时,可读性很好,条件过多时,会显得冗长。
灵活性 较低,只能做“等于”的判断。 极高,可以做 >, <, , , &&, 等各种复杂的逻辑组合。
执行效率 在某些编译器和场景下,switch 可能会生成更高效的跳转表(jump table)代码,比一连串的 if-else 更快。 效率取决于条件的顺序,最坏情况下(条件不满足),需要检查所有条件。

选择建议:

  • 优先使用 switch:当你需要检查同一个整型变量是否等于几个固定的值时(根据菜单选项、状态码、星期几等)。
  • 使用 if-else if-else:当你需要判断的范围、类型或逻辑比较复杂时(判断成绩是否在 90-100 之间,判断字符串是否相等,或者需要组合多个条件)。

  1. 基本用途:根据一个整型变量的值,从多个代码分支中选择一个执行。
  2. 核心结构switch(expression) { case const: ... break; default: ... break; }
  3. break 的关键作用:防止 case 之间的代码“穿透”,执行完一个 case 后必须用 break 跳出。
  4. default 的作用:处理所有 case 都不匹配的“默认”情况。
  5. 适用场景:判断一个变量是否等于几个离散的整数值,此时比 if-else 更清晰。
  6. 不适用场景:判断浮点数、字符串、或者需要范围判断(如 x > 10)的情况,应使用 if-else

掌握 switch 语句是 C 语言编程的基础,理解其工作原理,特别是 break 语句的作用,对于编写正确、高效的代码至关重要。

-- 展开阅读全文 --
头像
c语言程序中 main函数的位置
« 上一篇 2025-12-28
dede install 403
下一篇 » 2025-12-28

相关文章

取消
微信二维码
支付宝二维码

目录[+]