C语言switch中break为何必须用?

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

核心概念

switch 语句和 break 语句的关系可以总结为一句话:break 用于终止 switch 语句的执行,防止“贯穿”(fall-through)现象。


switch 语句的基本结构

switch 语句是一个多路分支结构,它根据一个表达式的值来决定执行哪一段代码,其基本语法如下:

switch (expression) {
    case constant_expression1:
        // 代码块 1
        break;
    case constant_expression2:
        // 代码块 2
        break;
    case constant_expression3:
        // 代码块 3
        break;
    default:
        // 默认代码块 (当 expression 的值与所有 case 都不匹配时执行)
        break;
}

关键点:

  • expression:必须是整型(int)或字符型(char)。
  • constant_expression:必须是常量或常量表达式,并且每个 case 的值必须是唯一的。
  • default:是可选的,如果所有 case 都不匹配,则会执行 default 后的代码。

break 的作用:防止“贯穿”(Fall-through)

这是理解 switch 的关键。如果在 case 分支的代码块末尾没有 break 语句,程序会继续执行下一个 case 的代码,而不会进行任何判断。 这个现象就叫做“贯穿”或“掉落”。

示例1:没有 break 的情况(贯穿)

#include <stdio.h>
int main() {
    int day = 2;
    printf("今天是第 %d 天,天气是:", day);
    switch (day) {
        case 1:
            printf("晴天\n");
            // 没有 break,会继续执行 case 2
        case 2:
            printf("多云\n");
            // 没有 break,会继续执行 case 3
        case 3:
            printf("阴天\n");
            // 没有 break,会继续执行 default
        default:
            printf("未知天气\n");
            // 没有 break,但这里是 switch 的末尾,所以不影响
    }
    return 0;
}

输出结果:

今天是第 2 天,天气是:多云
阴天
未知天气

分析:

  1. day 的值是 2
  2. switch 语句开始匹配,找到 case 2:
  3. 程序开始执行 case 2: 后面的代码,打印 "多云"。
  4. 因为 case 2: 的末尾没有 break,程序不会跳出 switch,而是“贯穿”到下一个 case
  5. 接着执行 case 3: 的代码,打印 "阴天"。
  6. 同样,没有 break,继续“贯穿”到 default,打印 "未知天气"。
  7. switch 语句结束。

这通常不是我们想要的结果,我们希望 day=2 只打印 "多云"。


正确使用 break:实现真正的分支选择

为了实现“一旦匹配到某个 case,就只执行该 case 的代码然后退出 switch”,我们必须在每个 case 的代码块末尾加上 break 语句。

示例2:有 break 的情况(标准用法)

#include <stdio.h>
int main() {
    int day = 2;
    printf("今天是第 %d 天,天气是:", day);
    switch (day) {
        case 1:
            printf("晴天\n");
            break;  // 匹配到 case 1 后,执行完就跳出 switch
        case 2:
            printf("多云\n");
            break;  // 匹配到 case 2 后,执行完就跳出 switch
        case 3:
            printf("阴天\n");
            break;  // 匹配到 case 3 后,执行完就跳出 switch
        default:
            printf("未知天气\n");
            break;  // 虽然在末尾,但加上是好习惯
    }
    return 0;
}

输出结果:

今天是第 2 天,天气是:多云

分析:

  1. day 的值是 2
  2. 匹配到 case 2:
  3. 执行打印 "多云"。
  4. 遇到 break 语句,立即终止整个 switch 语句的执行。
  5. 程序跳转到 switch 语句后面的代码(即 return 0;)。

这样就实现了我们期望的单选逻辑。


break 的特殊应用:有意识的“贯穿”

虽然大多数情况下我们用 break 来防止贯穿,但有时候,开发者会故意省略 break 来实现多个 case 执行同一段代码的功能,这是一种编程技巧,但需要非常清晰,最好加上注释,以免引起误解。

示例3:有意识的贯穿

假设我们要根据成绩给出评语:90分以上为“优秀”,80-89为“良好”,70-79为“中等”,60-69为“及格”,60分以下为“不及格”,我们可以这样写:

#include <stdio.h>
int main() {
    int score = 85;
    printf("分数: %d, 评语: ", score);
    switch (score / 10) { // 使用整数除法,将分数区间转换为 0-9 的整数
        case 10:
        case 9:
            printf("优秀\n");
            break;
        case 8:
            printf("良好\n");
            break;
        case 7:
            printf("中等\n");
            break;
        case 6:
            printf("及格\n");
            break;
        default: // 包含了 5, 4, 3, 2, 1, 0 以及负数
            printf("不及格\n");
            break;
    }
    return 0;
}

输出结果:

分数: 85, 评语: 良好

分析:

  • score = 85score / 10 的结果是 8
  • 程序匹配到 case 8:
  • 执行 printf("良好\n");
  • 遇到 break,跳出 switch

score = 95score / 10 的结果是 9

  • 程序匹配到 case 9:
  • 因为 case 9: 后面没有 break,程序会“贯穿”到下一个 case,即 case 10:
  • case 10: 后面也没有 break,继续“贯穿”,直到遇到 case 8:break
  • case 9:case 10: 都会执行 printf("优秀\n");

break 的作用域

非常重要的一点是:break 只能跳出它所在的最近的循环(for, while, do-while)或 switch 语句。

示例4:break 在嵌套结构中的行为

#include <stdio.h>
int main() {
    int i = 0;
    int j = 0;
    for (i = 0; i < 3; i++) {
        printf("--- 外层循环 i = %d ---\n", i);
        switch (i) {
            case 0:
                printf("  进入 case 0\n");
                break; // 这个 break 只会跳出 switch,不会跳出 for 循环
            case 1:
                printf("  进入 case 1\n");
                break;
            default:
                break;
        }
        printf("  switch 语句结束,继续外层循环\n");
    }
    return 0;
}

输出结果:

--- 外层循环 i = 0 ---
  进入 case 0
  switch 语句结束,继续外层循环
--- 外层循环 i = 1 ---
  进入 case 1
  switch 语句结束,继续外层循环
--- 外层循环 i = 2 ---
  switch 语句结束,继续外层循环

分析: breakswitch 内部,它只负责终止 switch,然后程序继续执行 switch 之后的代码,也就是 for 循环的下一轮迭代,它不会影响到外层的 for 循环。


情况 描述 示例 结果
break 贯穿:执行匹配的 case 后,继续执行后续所有 case 的代码。 case 1: printf("A"); case 2: printf("B"); 如果匹配 case 1,输出 "AB"。
break 标准用法:执行匹配的 case 后,立即退出 switch case 1: printf("A"); break; case 2: printf("B"); 如果匹配 case 1,只输出 "A"。
有意识的贯穿 技巧用法:多个 case 共享同一段代码。 case 1: case 2: printf("A"); break; 如果匹配 case 1case 2,都输出 "A"。
break 作用域 break 只能跳出其所在的最近的 switch 或循环。 for(...) { switch(...) { break; } } break 只跳出 switch,不跳出 for

最佳实践:

  1. 默认使用 break:在绝大多数情况下,每个 case 的末尾都应该加上 break
  2. 注释贯穿行为:如果你故意省略 break 来实现贯穿,务必添加清晰的注释,说明这是有意为之。
  3. default 后面也最好加上 break,这是一种良好的编程习惯,可以使代码结构更清晰,也方便未来修改。
-- 展开阅读全文 --
头像
房地产企业通用织梦源码有何优势?
« 上一篇 01-14
织梦自定义字段怎么调用?
下一篇 » 01-14
取消
微信二维码
支付宝二维码

目录[+]