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

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

switch 语句是一种多路分支控制结构,它允许一个变量根据其值来执行不同的代码块,它可以看作是 if-else if-else 链的一种更清晰、更高效的替代方案,特别是在处理多个离散值时。

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

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, enum 类型,以及它们的 unsigned 版本)。不能是浮点型(如 float, double)或字符串类型
    • 这个表达式的值会与下面 case 标签中的常量进行比较。
  2. case constant::

    • case 是关键字。
    • constant 必须是一个常量或常量表达式10, 'A', 2+3)。不能是变量
    • switch 的表达式的值与某个 case 的常量值相等,程序就会从该 case 的位置开始执行。
  3. break;:

    • break 语句的作用是跳出整个 switch 语句
    • 如果没有 break 语句,程序会继续执行下一个 case 的代码,这被称为"贯穿"(fall-through),在某些情况下这是有用的,但大多数情况下,忘记写 break 是一个常见的错误。
  4. default::

    switch case c语言
    (图片来源网络,侵删)
    • default 是一个可选的分支。
    • switch 表达式的值不匹配任何一个 case,程序就会执行 default 分支的代码。
    • default 分支可以放在 switch 语句的任何位置,但通常放在最后,并且它本身也需要 break 语句(尽管它后面没有其他 case,但为了代码清晰和风格统一,最好加上)。

代码示例

示例 1:基本用法(带 break

这是一个最典型的用法,根据输入的数字(1-7)来输出星期几。

#include <stdio.h>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n"); // day 的值是 3,所以会执行这里
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("无效的数字\n");
            break;
    }
    return 0;
}

输出:

星期三

示例 2:switch 的 "贯穿" 特性

我们希望多个 case 执行相同的代码块,这时就可以利用 "贯穿" 特性,省略 break

#include <stdio.h>
int main() {
    char grade = 'B';
    switch (grade) {
        case 'A':
            printf("优秀!\n");
            break;
        case 'B':
        case 'C':
            printf("良好!\n"); // grade 是 'B' 或 'C' 时,都会执行这里的代码
            break;
        case 'D':
            printf("及格.\n");
            break;
        case 'F':
            printf("不及格.\n");
            break;
        default:
            printf("无效的成绩\n");
            break;
    }
    return 0;
}

输出 (当 grade = 'B' 时):

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

示例 3:忘记 break 的错误示例

这是一个经典的错误,展示了如果没有 break 会发生什么。

#include <stdio.h>
int main() {
    int number = 2;
    switch (number) {
        case 1:
            printf("Case 1\n");
            // 没有 break!
        case 2:
            printf("Case 2\n"); // number 是 2,匹配,开始执行
            // 没有 break!
        case 3:
            printf("Case 3\n"); // 因为上一个 case 没有 break,所以继续执行这里
            break;
        default:
            printf("Default\n");
            break;
    }
    return 0;
}

输出:

Case 2
Case 3

程序从 case 2 开始执行,因为没有 break,所以一路“贯穿”到了 case 3,直到遇到 break 才退出 switch


switchif-else if-else 的比较

特性 switch 语句 if-else if-else 语句
判断条件 只能判断整型int, char, enum 可以判断任何类型(整数、浮点数、字符、字符串等)
判断形式 精确匹配() 可以使用任何比较运算符(, , >, <, >=, <=
代码可读性 当有多个离散值分支时,代码结构更清晰、更易读 当分支逻辑复杂或条件范围判断时,更灵活、更直观
实现效率 在某些情况下,编译器可以生成更高效的跳转表代码 效率通常略低于 switch,因为它是逐个条件判断的

何时使用?

  • 优先使用 switch:当你需要根据一个变量的多个离散整数值来执行不同的操作时,

    • 处理菜单选项 (1, 2, ..)
    • 处理星期几 (1-7)
    • 处理状态码 (0=成功, 1=失败, 2=进行中)
  • 使用 if-else if-else:当你的判断条件更复杂时,

    • 判断一个范围(if (x > 10 && x < 20)
    • 判断浮点数(if (price > 99.99)
    • 判断字符串(if (strcmp(name, "admin") == 0)
    • 只有少数几个分支,或者逻辑非常简单。

switch 是 C 语言中一个非常重要且强大的控制流工具,掌握它的关键点在于:

  1. 理解其工作原理:通过匹配表达式的值来跳转到相应的 case
  2. 牢记 break 的重要性:在大多数情况下,每个 case 末尾都需要 break 来防止不必要的“贯穿”。
  3. 知道何时使用它:在处理多个离散整数值分支时,switch 是比 if-else if-else 更优雅、更高效的选择。
-- 展开阅读全文 --
头像
switch语句中case后必须跟break吗?
« 上一篇 01-18
C语言Hello World如何编写运行?
下一篇 » 01-18

相关文章

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

目录[+]