c语言 switch

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

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


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):

    • expression 是一个整型表达式(包括 int, char, short, long 等,因为 char 在 C 中本质上是整型)。
    • 这个表达式的值会被计算出来,然后与每个 case 后面的常量进行比较。
  2. case constant::

    • constant 必须是一个常量或常量表达式(不能是变量,case x: 是错误的,但 case 1+2: 是可以的)。
    • case 标签只是一个入口点,不是一个代码块的开头,当 switch 的值匹配某个 case 时,程序会从该 case 的位置开始执行,并继续向下执行,直到遇到 break 语句或 switch 语句的结束大括号 ,这被称为“贯穿” (fall-through)
  3. break;:

    • break 语句的作用是立即退出 switch 语句
    • 当执行到 break 时,程序会跳转到 switch 语句后面的第一条语句继续执行。
    • 忘记写 break 是最常见的错误,会导致程序执行所有后续的 case 代码。
  4. default::

    • default 是一个可选的部分。
    • switch 的值与任何一个 case 都不匹配,程序就会执行 default 后面的代码。
    • default 的位置是灵活的,但通常放在最后,它就像 if-else 结构中的 else

一个简单的例子

下面是一个使用 switch 语句根据用户输入的数字输出对应星期名称的例子。

#include <stdio.h>
int main() {
    int day;
    printf("请输入一个数字 (1-7): ");
    scanf("%d", &day);
    switch (day) {
        case 1:
            printf("星期一\n");
            break;
        case 2:
            printf("星期二\n");
            break;
        case 3:
            printf("星期三\n");
            break;
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("输入无效,请输入 1 到 7 之间的数字,\n");
            break;
    }
    return 0;
}

执行流程分析:

  1. 用户输入数字 3
  2. switch(day) 的值为 3
  3. 程序开始匹配 case
  4. case 1 不匹配,跳过。
  5. case 2 不匹配,跳过。
  6. case 3 匹配!程序从 printf("星期三\n"); 开始执行。
  7. 遇到 break;,立即退出 switch 结构。
  8. 程序继续执行 return 0;

“贯穿” (Fall-through) 特性

switch 的一个重要特性是“贯穿”,如果你在一个 case 结尾忘记写 break,程序会继续执行下一个 case 的代码。

示例:

#include <stdio.h>
int main() {
    char grade = 'B';
    switch (grade) {
        case 'A':
            printf("优秀!\n");
            break;
        case 'B':
            printf("良好!\n");
            // 故意忘记 break
        case 'C':
            printf("及格.\n");
            break;
        case 'D':
            printf("不及格.\n");
            break;
        default:
            printf("无效等级.\n");
    }
    return 0;
}

输出结果:

良好!
及格.

原因分析:

  1. grade'B'
  2. 匹配到 case 'B',打印 "良好!"。
  3. 没有遇到 break,程序继续向下执行。
  4. 进入 case 'C',打印 "及格."。
  5. 遇到 break,退出 switch

“贯穿”的用途: 虽然“贯穿”常常是疏忽导致的,但有时它是有意为之的,当多个 case 需要执行相同的操作时:

#include <stdio.h>
int main() {
    int month = 9;
    switch (month) {
        case 9:
        case 10:
        case 11:
            printf("秋季\n");
            break;
        case 12:
        case 1:
        case 2:
            printf("冬季\n");
            break;
        // ... 其他季节
        default:
            printf("无效的月份\n");
    }
    return 0;
}

month9, 10, 或 11 时,都会执行 printf("秋季\n");


switchif-else if-else 的对比

特性 switch 语句 if-else if-else 语句
可读性 当判断多个离散值时,代码结构更清晰。 当判断范围或复杂条件时,更自然。
表达式类型 只能是整型 (int, char 等)。 可以是任何可比较的类型(int, float, double, char)以及复杂的逻辑表达式(如 a > b && c < d)。
性能 在某些情况下,编译器可以生成更高效的跳转表(jump table),性能可能优于一连串的 if 比较。 通常需要进行多次条件判断,效率可能稍低。
灵活性 较低,只能进行相等性比较。 非常高,可以进行任何类型的比较(>, <, , , >=, <=)。

何时使用 switch 当需要根据一个变量的具体值来执行不同操作,且这些值是有限的、离散的整型值时,优先使用 switch

何时使用 if-else if-else 当需要判断范围(如 if (x > 10 && x < 20))、浮点数复杂逻辑或变量类型不是整型时,必须使用 if-else if-else


最佳实践和注意事项

  1. 总是加上 break:除非你明确需要“贯穿”行为,否则在每个 case 的末尾都加上 break
  2. 考虑 default:为了处理意外或无效的输入,最好总是包含一个 default 分支。
  3. 变量作用域:在 C99 标准及以后,你可以在 switch 语句内部声明变量,但要注意,变量的作用域从其声明点开始,到 switch 块的末尾结束,为了避免意外,最好在 case 块的开头声明变量。
// C99 及以后
switch (x) {
    case 1:
        int y = 10; // y 的作用域从这里开始
        printf("%d\n", y);
        break;
    case 2:
        // printf("%d\n", y); // 错误!y 在这里不可见
        break;
    // ...
}

switch 是 C 语言中一个非常强大的控制流工具,它通过“匹配-执行-跳出”的模式,为处理多路分支提供了优雅的解决方案,理解其“贯穿”特性是掌握 switch 的关键,在适当的情况下,它能比 if-else if-else 链条提供更清晰、更高效的代码。

-- 展开阅读全文 --
头像
C语言socket编程如何实现网络通信?
« 上一篇 04-22
dede织梦帝国CMS如何选择?
下一篇 » 04-22

相关文章

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

目录[+]