switch语句中case后必须跟break吗?

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

switch 是一种多路分支语句,它允许一个变量根据其值来执行不同的代码块,你可以把它想象成一系列的 if-else if-else 语句的简化版,特别适用于需要检查同一个变量与多个常量值是否相等的场景。

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

switch 语句的基本语法

switch 语句的基本结构如下:

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

switch 语句的执行流程

  1. 计算表达式:程序首先计算 switch 后面的 expression 的值。
  2. 匹配 Case:程序将这个计算结果与每个 case 后面的 constant(常量)进行比较。
  3. 执行代码
    • 如果找到了一个匹配的 case,程序就会从该 case 的标签开始执行其下面的代码。
    • 如果没有找到任何匹配的 case,程序就会跳转到 default 标签(如果存在)并执行其下面的代码。
  4. break 的关键作用:当代码执行到 break 语句时,程序会立即跳出整个 switch 语句,继续执行 switch 代码块后面的下一条语句。

⚠️ 极其重要的注意事项:break

如果你在某个 case 中没有写 break,程序会“掉下去”,继续执行下一个 case 的代码,直到遇到一个 break 语句或者 switch 语句的结束大括号 ,这种现象被称为 "fall-through"(贯穿),这通常是一个错误,但在某些特定场景下也可以被利用。


代码示例

示例 1:基本用法(带 break

这是最常见、最标准的用法。

c语言 case switch
(图片来源网络,侵删)
#include <stdio.h>
int main() {
    int day = 3;
    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("无效的日期\n");
            break;
    }
    return 0;
}

输出:

星期三

执行过程:

  1. day 的值是 3
  2. switch 开始匹配,发现 case 3: 匹配成功。
  3. 程序执行 printf("星期三\n");
  4. 接着遇到 break;,程序立即跳出 switch 结构,main 函数结束。

示例 2:fall-through(贯穿)现象

这个例子展示了如果没有 break 会发生什么。

#include <stdio.h>
int main() {
    int grade = 'B'; // 字符 'B' 的 ASCII 码是 66
    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");
            break;
    }
    return 0;
}

输出:

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

执行过程:

  1. grade 的值是 'B' (66)。
  2. switch 匹配到 case 'B':
  3. 程序执行 printf("良好!\n");
  4. 由于后面没有 break,程序没有跳出,而是继续执行下一个 case 的代码。
  5. 程序执行 printf("及格.\n");
  6. 遇到 break,程序才跳出 switch

示例 3:default 的位置

default 标签可以放在 switch 结构的任何位置,但通常习惯放在最后,它的作用是处理所有未被 case 捕获的情况。

#include <stdio.h>
int main() {
    int number = 99;
    switch (number) {
        default: // 即使放在最前面,也只在所有 case 都不匹配时才执行
            printf("数字不在 1 到 5 的范围内\n");
            break;
        case 1:
            printf("数字是 1\n");
            break;
        case 2:
            printf("数字是 2\n");
            break;
        case 3:
            case 4: // 多个 case 共享同一块代码
            case 5:
            printf("数字是 3, 4 或 5\n");
            break;
    }
    return 0;
}

输出:

数字不在 1 到 5 的范围内

switch vs if-else if-else

特性 switch 语句 if-else if-else 语句
判断条件 只能判断离散的、确定的常量值 可以判断任何表达式,包括范围、关系、逻辑等。
数据类型 通常是 intchar 类型,在 C99 及以后,也可以是 long 等。 任何数据类型都可以。
执行效率 在某些情况下,编译器可以生成更高效的跳转表,执行速度可能更快。 对于复杂的条件链,效率可能稍低,但现代编译器优化得很好。
代码可读性 当需要检查同一个变量与多个常量是否相等时,switch 结构更清晰、更易读。 当逻辑比较复杂(如 if (x > 10 && x < 20))时,if-else 更自然。

选择建议:

  • 如果你的逻辑是检查一个变量是否等于 ABC... 等几个固定值,优先使用 switch
  • 如果你的逻辑涉及范围判断(如 x > 100)、复杂的布尔逻辑(如 a && b)或不同类型的判断,使用 if-else if-else

重要规则和限制

  1. expression 的类型switch 后的表达式必须是整型int, char, short, long 等),不能是 float, double 或字符串。
  2. case 的常量:每个 case 后面的值必须是常量或常量表达式,不能是变量。case x: 是错误的,但 case 10+20: 是正确的。
  3. case 唯一性:在一个 switch 结构中,case 后面的常量值必须是唯一的,不能重复,两个 case 1: 是不允许的。
  4. default 可选default 标签是可选的,可以省略,如果省略,并且没有 case 匹配,switch 语句将什么都不做。

switch 是 C 语言中一个强大而简洁的控制流工具,特别适用于处理基于单一变量值的多种情况,理解并牢记 break 语句的作用是掌握 switch 的关键,它能让你的代码在特定场景下比冗长的 if-else if-else 链更清晰、更高效。

-- 展开阅读全文 --
头像
dede 404页面模板下载在哪里找?
« 上一篇 01-18
Switch Case在C语言中如何高效使用?
下一篇 » 01-18

相关文章

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

目录[+]