Switch C语言如何高效实现多分支选择?

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

switch 是一种多路分支结构,它允许一个变量或表达式与一系列值进行比较,并根据匹配的值执行相应的代码块,它可以看作是 if-else if-else 链的一种更清晰、更高效的替代方案,特别是在处理多个离散的整型值时。

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

switch 语句的基本语法

switch (expression) {
    case constant1:
        // 当 expression 的值等于 constant1 时,执行的代码
        break;
    case constant2:
        // 当 expression 的值等于 constant2 时,执行的代码
        break;
    case constant3:
        // 当 expression 的值等于 constant3 时,执行的代码
        break;
    default:
        // expression 的值与所有 case 都不匹配时,执行的代码
        break;
}

语法要点解析:

  • switch (expression): expression 是一个整型表达式(在 C 语言中,这包括 int, char, short, long 等以及它们的 unsigned 版本),它不能是浮点型(float, double)。
  • case constant:: constant 必须是一个常量常量表达式(如 10, 'A', 2*5),每个 case 后面的值必须是唯一的,不能有重复。
  • break;: 这是 switch 语句中极其重要的一部分! break 语句的作用是立即终止 switch 语句的执行,程序将跳转到 switch 代码块后面的第一条语句,如果某个 case 后面没有 break,程序会“掉落”(fall-through)并继续执行下一个 case 的代码,直到遇到一个 breakswitch 代码块结束。
  • default:: default 是一个可选的分支。expression 的值与任何一个 case 都不匹配,程序就会执行 default 后面的代码。default 的位置可以任意放置,但通常放在最后,它类似于 if-else 结构中的 else

switch 语句的执行流程

  1. 计算 switch 后面的 expression 的值。
  2. 将这个计算结果与第一个 case 的常量进行比较。
  3. 如果匹配,则执行该 case 后面的所有代码,直到遇到 breakswitch 代码块结束。
  4. 如果不匹配,则跳到下一个 case 进行比较。
  5. 如果所有 case 都不匹配,并且存在 default 分支,则执行 default 后面的代码。
  6. 如果没有 default 分支且所有 case 都不匹配,则 switch 语句什么也不做,程序继续执行 switch 代码块后面的语句。

代码示例

示例 1:基本用法(带 break

这是一个最常见、最标准的用法,每个 case 都有自己的 break

#include <stdio.h>
int main() {
    int day = 3;
    char dayName[20];
    switch (day) {
        case 1:
            strcpy(dayName, "Monday");
            break;
        case 2:
            strcpy(dayName, "Tuesday");
            break;
        case 3:
            strcpy(dayName, "Wednesday");
            break;
        case 4:
            strcpy(dayName, "Thursday");
            break;
        case 5:
            strcpy(dayName, "Friday");
            break;
        case 6:
            strcpy(dayName, "Saturday");
            break;
        case 7:
            strcpy(dayName, "Sunday");
            break;
        default:
            strcpy(dayName, "Invalid day");
            break;
    }
    printf("Day %d is %s\n", day, dayName); // 输出: Day 3 is Wednesday
    return 0;
}

分析: day 的值是 3,与 case 3: 匹配,执行 strcpy 语句,然后遇到 breakswitch 语句结束。

示例 2:“掉落”(Fall-Through)特性

“掉落”特性是有用的,判断一个字符是否为元音字母。

switch c语言'
(图片来源网络,侵删)
#include <stdio.h>
int main() {
    char ch = 'e';
    int isVowel = 0; // 0 代表假,1 代表真
    switch (ch) {
        case 'a':
        case 'e':
        case 'i':
        case 'o':
        case 'u':
        case 'A':
        case 'E':
        case 'I':
        case 'O':
        case 'U':
            isVowel = 1;
            break;
        default:
            isVowel = 0;
            break;
    }
    if (isVowel) {
        printf("%c is a vowel.\n", ch); // 输出: e is a vowel.
    } else {
        printf("%c is not a vowel.\n", ch);
    }
    return 0;
}

分析: ch'e',程序进入 case 'a':,发现没有 break,于是继续向下执行,进入 case 'e':,匹配成功,设置 isVowel = 1,然后遇到 break,退出 switch,这种写法比多个 if-else if 更简洁。

示例 3:没有 break 的情况(危险!)

忘记写 break 是一个非常常见的错误。

#include <stdio.h>
int main() {
    int grade = 2;
    switch (grade) {
        case 1:
            printf("Grade 1: Excellent\n");
            break; // grade 是 1,会执行到这里并退出
        case 2:
            printf("Grade 2: Good\n");
            // 故意忘记 break
        case 3:
            printf("Grade 3: Pass\n");
            break;
        default:
            printf("Invalid grade\n");
            break;
    }
    return 0;
}

分析: grade2,程序会:

  1. 匹配 case 2:,打印 "Grade 2: Good"
  2. 因为没有 break,程序继续执行下一个 case,即 case 3:,打印 "Grade 3: Pass"
  3. 然后遇到 case 3:break,退出 switch输出结果:
    Grade 2: Good
    Grade 3: Pass

    这显然不是我们想要的结果。


switch vs. if-else if-else

特性 switch 语句 if-else if-else 语句
比较类型 仅限于整型int, char等) 可以比较任何类型(整数、浮点数、字符串等)
条件形式 常量进行比较 任意表达式进行比较
可读性 当有多个离散值分支时,代码更清晰、结构化 当分支较少或条件复杂时,代码更自然
执行效率 在某些情况下(尤其是在多分支时)可能比一长串 if-else 更高效,因为它可能使用“跳转表”实现。 对于简单的两三个分支,效率差别不大。
掉落特性 有“掉落”特性,可用于共享代码块。 没有“掉落”特性,每个 else if 都是独立的。

何时使用 switch 当你需要根据一个整型变量的多个离散值来执行不同的操作时,switch 是最佳选择。

  • 菜单选择 (case 1: ... case 2: ...)
  • 状态机 (case IDLE: ... case RUNNING: ...)
  • 错误码处理 (case 404: ... case 500: ...)

何时使用 if-else if-else

  • 当你需要比较范围时(如 if (score >= 90 && score <= 100))。
  • 当你需要比较浮点数时。
  • 当条件是复杂的逻辑表达式时。
  • 当分支数量很少时(例如只有2-3个)。

switch 是 C 语言中一个强大而优雅的工具,用于处理多路分支逻辑,理解其核心要点至关重要:

  1. 表达式必须是整型
  2. case 后面必须是常量
  3. break 是控制流程的关键,用于防止“掉落”。
  4. default 提供了“其他情况”的处理
  5. 善用“掉落”特性可以写出更简洁的代码(如判断元音)。

正确使用 switch 可以让你的代码更加清晰、易读且易于维护。

-- 展开阅读全文 --
头像
织梦误删自定义表单
« 上一篇 04-18
Wrapper在C语言中如何实现?
下一篇 » 04-18

相关文章

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

目录[+]