C语言break在switch中必须用吗?

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

switch 语句

switch 语句是一种多路分支结构,它可以根据一个变量的值来执行不同的代码块,它通常用来替代复杂的 if-else if-else 结构,使代码更易读。

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

基本语法

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

关键规则

  • expression (表达式): 必须是一个整型表达式(int, char, long 等),但不能是 float, double 或字符串。
  • constant (常量): 每个 case 后面的值必须是一个常量或常量表达式,不能是变量,并且所有 case 的值必须是唯一的。
  • default (默认): default 是可选的。expression 的值与任何一个 case 都不匹配,程序就会执行 default 后面的代码块。default 的位置可以灵活放置,但通常放在最后。

break 语句

break 语句有两个主要作用:

  1. switch 语句中,立即终止 switch 的执行。
  2. 在循环语句(for, while, do-while)中,立即终止循环的执行。

在本节中,我们重点讨论它在 switch 中的作用。

breakswitch 中的核心作用:跳出 switch

break 就像一个“终结者”,当程序执行到 switch 语句中的某个 case 并遇到 break 时,它会立即停止执行 switch 语句的剩余部分,程序的控制权会转移到 switch 语句后面的第一条语句。

如果没有 break 会发生什么?—— 贯穿现象

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

这是 switch 语句最核心、也最容易出错的地方,如果某个 case 的分支末尾没有 break 语句,程序在执行完该 case 的代码后,会继续向下执行下一个 case 的代码,直到遇到一个 break 语句或者 switch 语句的结束大括号 ,这种现象被称为 "fall-through"(贯穿)。


breakswitch 的结合使用(示例)

让我们通过几个例子来彻底理解。

示例 1:使用 break 的标准情况

这个例子展示了 break 如何确保每个 case 是独立的。

#include <stdio.h>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("星期一\n");
            break; // 遇到 break,跳出 switch
        case 2:
            printf("星期二\n");
            break; // 遇到 break,跳出 switch
        case 3:
            printf("星期三\n");
            break; // 遇到 break,跳出 switch
        case 4:
            printf("星期四\n");
            break;
        case 5:
            printf("星期五\n");
            break;
        case 6:
            printf("星期六\n");
            break;
        case 7:
            printf("星期日\n");
            break;
        default:
            printf("无效的输入\n");
            break;
    }
    // 程序会跳到这里执行
    printf("switch 语句结束,\n");
    return 0;
}

输出:

c语言break与switch
(图片来源网络,侵删)
星期三
switch 语句结束。

分析: day 的值是 3,程序匹配到 case 3,打印 "星期三",然后遇到 break,立即终止整个 switch 结构,执行后面的 printf 语句。


示例 2:不使用 break 的贯穿现象

这个例子展示了缺少 break 的后果。

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

输出:

良好!
及格.
不及格.

分析:

  1. grade 的值是 'B',程序匹配到 case 'B'
  2. 打印 "良好!"。
  3. 因为 case 'B' 后面没有 break,程序没有跳出 switch,而是继续向下执行
  4. 它进入了 case 'C',打印 "及格."。
  5. case 'C' 后面也没有 break,程序继续向下执行。
  6. 它进入了 case 'D',打印 "不及格."。
  7. case 'D' 后面有 break,程序终于跳出 switch

示例 3:利用贯穿现象的巧妙用法

虽然贯穿现象常常是bug的来源,但在某些特定场景下,它可以被巧妙地利用,从而减少代码重复,在评分系统中,A和B可能都对应“优秀”,C和D都对应“及格”。

#include <stdio.h>
int main() {
    int grade = 'A';
    switch (grade) {
        case 'A':
        case 'B':
            // A和B都会执行到这里
            printf("优秀!\n");
            break;
        case 'C':
        case 'D':
            // C和D都会执行到这里
            printf("及格.\n");
            break;
        default:
            printf("无效的等级.\n");
    }
    return 0;
}

输出:

优秀!

分析:

  1. grade 是 'A',匹配到 case 'A'
  2. 没有代码,也没有 break,所以程序贯穿到下一个 case
  3. 它进入 case 'B',打印 "优秀!"。
  4. case 'B' 后面有 break,跳出 switch

这种方式比写两个 if-else 结构要简洁得多。


总结与最佳实践

特性/场景 switch 语句 break 语句
作用 实现多路分支选择。 switch 或循环中,立即终止当前结构。
核心关系 switch 定义了分支的入口。 breakswitch 分支的“出口”。
关键点 switch 通过 expression 的值匹配 case 默认情况下,switch 会发生“贯穿”现象
最佳实践 几乎在每个 case 的末尾都加上 break,除非你明确地需要“贯穿”行为。
2. 如果需要“贯穿”,最好在代码中添加注释,明确告知其他开发者这是有意为之的,而不是忘记写 break
3. 当分支逻辑复杂或判断条件范围不连续时,switch 是很好的选择。

简单记忆: switch 像一个多岔路口,case 是路口的牌子。break 就像在每个路口设置的“此路不通,请离开”的标志牌,如果没有这个标志牌,车(程序)会一路开下去,直到遇到下一个有标志牌的路口或者路的尽头。

-- 展开阅读全文 --
头像
织梦建站仿站教程23集,如何快速掌握仿站技巧?
« 上一篇 01-14
char与string在C语言中究竟有何区别?
下一篇 » 01-14
取消
微信二维码
支付宝二维码

目录[+]