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

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

switch-case 是一种多路分支语句,它可以根据一个变量的值,从多个代码块中选择一个来执行,它通常可以替代复杂的 if-else if-else 结构,使代码更清晰、更易读。

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

基本语法

switch 语句的基本结构如下:

switch (expression) {
    case constant_expression1:
        // 当 expression 的值等于 constant_expression1 时,执行这里的代码
        break; // 可选,但强烈推荐
    case constant_expression2:
        // 当 expression 的值等于 constant_expression2 时,执行这里的代码
        break; // 可选,但强烈推荐
    case constant_expression3:
        // 当 expression 的值等于 constant_expression3 时,执行这里的代码
        break; // 可选,但强烈推荐
    default:
        // expression 的值不匹配任何一个 case,执行这里的代码
        break; // 可选,但强烈推荐
}

语法规则详解

  1. switch 表达式

    • 圆括号中的 expression 必须是一个整型表达式,这意味着它可以是一个 int, char, short, long 等整型类型的变量或常量。不能是 float, doublestring
  2. case

    • 每个 case 后面跟一个常量表达式constant_expression),这个值必须是编译时就能确定的常量,不能是变量。
    • case 标签的值必须是唯一的,不能有两个 case 标签使用相同的常量值。
    • case 标签本身只是一个入口点,它不包含任何执行逻辑,当 switch 表达式的值与某个 case 的常量匹配时,程序就会跳转到那个 case 标签所在的位置开始执行,然后继续向下执行,除非遇到 break 语句。
  3. break 语句

    switchcase c语言
    (图片来源网络,侵删)
    • break 语句的作用是跳出 switch 语句,当执行到 break 时,程序会立即终止 switch 的执行,然后跳转到 switch 语句后面的第一条语句继续执行。
    • break 是可选的,但如果不使用它,就会发生“case 穿透”(case falling through)现象。
  4. default

    • default 是一个可选的分支。switch 表达式的值与任何一个 case 标签都不匹配,程序就会跳转到 default 标签处执行。
    • default 可以放在 switch 语句的任何位置(开头、中间或结尾),但通常习惯放在最后。
    • default 后面也可以使用 break,尤其是在它不在末尾时,或者为了代码风格统一。

核心概念:Case 穿透

这是理解 switch 语句最关键的一点,如果没有 break 语句,程序在匹配到一个 case 后,会继续执行下一个 case 的代码,直到遇到 breakswitch 语句的末尾。

示例:不使用 break(Case 穿透)

#include <stdio.h>
int main() {
    int grade = 'B'; // ASCII码中 'B' 对应 66
    switch (grade) {
        case 'A':
            printf("Excellent!\n");
            break; // 如果匹配 'A',执行完这句就退出switch
        case 'B':
            printf("Good job!\n");
            // 没有 break,所以会继续向下执行
        case 'C':
            printf("Average.\n");
            // 没有 break,所以会继续向下执行
        case 'D':
            printf("You need to work harder.\n");
            break; // 遇到 break,退出 switch
        default:
            printf("Invalid grade.\n");
            break;
    }
    return 0;
}

输出结果:

Good job!
Average.
You need to work harder.

过程分析:

switchcase c语言
(图片来源网络,侵删)
  1. grade 的值是 'B'(即 66)。
  2. switch 开始匹配,发现 'B' 匹配第二个 case
  3. 程序跳转到 case 'B':,打印 Good job!
  4. 因为这里没有 break,程序不会退出 switch,而是继续向下执行 case 'C': 的代码。
  5. 打印 Average.
  6. 同样,没有 break,继续向下执行 case 'D': 的代码。
  7. 打印 You need to work harder.
  8. 遇到 breakswitch 语句执行结束。

示例:使用 break(标准用法)

#include <stdio.h>
int main() {
    int grade = 'B';
    switch (grade) {
        case 'A':
            printf("Excellent!\n");
            break;
        case 'B':
            printf("Good job!\n");
            break; // 添加 break,执行完就退出
        case 'C':
            printf("Average.\n");
            break;
        case 'D':
            printf("You need to work harder.\n");
            break;
        default:
            printf("Invalid grade.\n");
            break;
    }
    return 0;
}

输出结果:

Good job!

这次,程序在执行完 case 'B' 的代码后,立即遇到了 breakswitch 语句就结束了。


switch vs. if-else if-else

什么时候用 switch,什么时候用 if-else

特性 switch-case if-else if-else
判断条件 只能判断整型字符型常量。 可以判断任何类型的表达式(整数、浮点数、字符串、逻辑运算等)。
可读性 当判断条件是多个离散的、固定的值时,switch 结构更清晰。 当判断条件范围复杂、逻辑关系多样时,if-else 更灵活。
实现原理 通常使用跳转表实现,效率可能更高。 使用一系列的条件判断,效率取决于条件的顺序。
case 穿透 是其固有特性,可以有意利用。 没有“穿透”的概念,每个 else if 都是独立的。

经验法则:

  • 如果你要判断一个变量是否等于几个固定的、离散的值1, 2, 3'A', 'B', 'C'),优先使用 switch
  • 如果你要判断的是一个范围x > 10 && x < 20)或者复杂的逻辑组合,必须使用 if-else

综合示例

示例:根据输入的数字输出对应的星期几

#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;
}

高级用法:有意的 Case 穿透

case 穿透特性是有用的,在评分系统中,A+、A、A- 都可以算作 "A" 等级。

#include <stdio.h>
int main() {
    char score = 'A';
    switch (score) {
        case 'A':
        case 'a':
            printf("等级: A (优秀)\n");
            break;
        case 'B':
        case 'b':
            printf("等级: B (良好)\n");
            break;
        case 'C':
        case 'c':
            printf("等级: C (及格)\n");
            break;
        default:
            printf("等级: F (不及格)\n");
            break;
    }
    return 0;
}

输出结果:

等级: A (优秀)

在这个例子中,无论 score'A' 还是 'a',程序都会跳转到 case 'A': 的位置,然后因为没有 break,继续向下执行 case 'a': 的代码,直到遇到 printfbreak,这样就实现了多个 case 执行同一段代码的目的。


  • switch 是一个多路分支结构,用于处理离散的、固定的值。
  • switch 的表达式必须是整型。
  • break 语句至关重要,用于终止 switch 的执行,忘记 break 是最常见的初学者错误。
  • default 分支提供了处理所有未匹配情况的“安全网”。
  • case 穿透既是陷阱,也可以被巧妙地利用。

掌握 switch-case 语句能让你的 C 语言代码在面对多条件选择时,变得更加简洁和优雅。

-- 展开阅读全文 --
头像
响应式教育织梦模板哪里下载?
« 上一篇 01-30
dede php执行sql语句的命令或方法是什么?
下一篇 » 01-30

相关文章

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