C语言中break在case里的作用是什么?

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

switch 语句

switch 语句是一种多路分支控制结构,它根据一个表达式的值来决定执行哪个代码块,它常用于替代多个 if-else if-else 语句,使代码更清晰、更易读。

switch 语句的基本语法如下:

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

case 的作用

case 关键字后面跟一个常量表达式(比如一个整数、字符等),它的作用是:

  1. case 本身不执行任何操作,它更像是一个或一个入口点
  2. 匹配switch 语句会将 expression 的值与每个 case 后面的 constant_expression 进行比较。
  3. 跳转:一旦找到第一个匹配的 case,程序就会跳转到那个 case 标签处,并开始执行其后面的代码。

break 的作用

break 关键字的作用是立即终止并退出当前的 switch 语句。


breakcase 的协同工作:case穿透 (Case Fall-through)

这是理解 switch 语句最关键的一点。如果没有 break 语句,程序会继续执行下一个 case 的代码,而不会进行任何新的匹配。 这个特性被称为 "case穿透" 或 "fall-through"。

让我们通过例子来理解。

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

#include <stdio.h>
int main() {
    int day = 3;
    switch (day) {
        case 1:
            printf("Monday\n");
            break; // 执行完 printf 后,遇到 break,立即退出 switch
        case 2:
            printf("Tuesday\n");
            break; // 执行完 printf 后,遇到 break,立即退出 switch
        case 3:
            printf("Wednesday\n");
            break; // 执行完 printf 后,遇到 break,立即退出 switch
        default:
            printf("Unknown day\n");
            break;
    }
    return 0;
}

输出:

Wednesday

执行流程:

  1. day 的值是 3
  2. switch 进入,开始匹配 case
  3. case 1 (值为1) 不匹配。
  4. case 2 (值为2) 不匹配。
  5. case 3 (值为3) 匹配
  6. 程序跳转到 case 3: 的位置,执行 printf("Wednesday\n");
  7. 遇到 break; 语句,立即终止整个 switch 结构。
  8. 程序继续执行 switch 之后的代码(return 0;)。

示例 2:没有 break 的情况(case穿透

#include <stdio.h>
int main() {
    int number = 2;
    switch (number) {
        case 1:
            printf("Option 1\n");
            break;
        case 2:
            printf("Option 2\n");
            // 注意:这里没有 break!
        case 3:
            printf("Option 3\n");
            break;
        default:
            printf("Default option\n");
    }
    return 0;
}

输出:

Option 2
Option 3

执行流程:

  1. number 的值是 2
  2. switch 进入,case 1 不匹配。
  3. case 2 (值为2) 匹配
  4. 程序跳转到 case 2: 的位置,执行 printf("Option 2\n");
  5. 没有遇到 break,所以程序不会退出 switch,它会继续向下执行。
  6. 它直接进入下一个 case (case 3),执行其代码 printf("Option 3\n");
  7. 遇到 break;,终于退出了 switch

这种“掉下去”的特性就是 case穿透


case穿透 的实际应用

虽然 case穿透 常常是一个疏忽导致的错误,但它也可以被有意利用来实现某些逻辑。

示例 3:利用 case穿透 简化代码

假设我们要根据一个分数评定等级:90-100是A,80-89是B,70-79是C,60-69是D,60以下是F,我们可以这样写:

#include <stdio.h>
int main() {
    int score = 85;
    switch (score / 10) { // 85 / 10 = 8
        case 10:
        case 9:
            printf("Grade: A\n");
            break;
        case 8:
            printf("Grade: B\n");
            break;
        case 7:
            printf("Grade: C\n");
            break;
        case 6:
            printf("Grade: D\n");
            break;
        default: // 0, 1, 2, 3, 4, 5
            printf("Grade: F\n");
            break;
    }
    return 0;
}

输出:

Grade: B

执行流程:

  1. score 是 85,score / 10 的结果是 8。
  2. switch 匹配 case 8:
  3. 执行 printf("Grade: B\n");
  4. 遇到 break,退出 switch

score 是 95 呢?

  1. score / 10 的结果是 9。
  2. switch 匹配 case 9:
  3. 执行 printf("Grade: A\n");
  4. 遇到 break,退出 switch

score 是 100 呢?

  1. score / 10 的结果是 10。
  2. switch 匹配 case 10:
  3. 由于没有 break,程序会穿透到下一个 case (case 9:)。
  4. 执行 printf("Grade: A\n");
  5. 遇到 break,退出 switch

这样,我们用 case穿透 巧妙地处理了两个范围(90-100)共享同一种情况(Grade A)。


default 子句

defaultswitch 的可选部分。switch 的表达式的值不匹配任何一个 case,那么程序就会跳转到 default 标签处执行。

default 的位置是灵活的,但通常放在最后。

#include <stdio.h>
int main() {
    int option = 5;
    switch (option) {
        case 1:
            printf("You selected 1.\n");
            break;
        case 2:
            printf("You selected 2.\n");
            break;
        default: // option 的值是 5,不匹配 case 1 或 2,所以执行这里
            printf("Invalid option.\n");
            break;
    }
    return 0;
}

输出:

Invalid option.

总结与最佳实践

  1. case 是入口,不是出口case 只是告诉程序从哪里开始执行。
  2. break 是出口break 是用来终止 switch 语句的。绝大多数情况下,每个 case 的末尾都应该有一个 break
  3. 警惕 case穿透:忘记写 break 是一个非常常见的初学者错误,会导致逻辑混乱和难以发现的 bug。
  4. 利用 case穿透:当你发现多个 case 需要执行完全相同的代码块时,可以有意地省略 break 来利用 case穿透,使代码更简洁。
  5. default 是好习惯:即使你认为所有情况都已覆盖,也最好加上一个 default 子句(里面可以只放一个 break),用于处理意外情况,增强代码的健壮性。

记住这个核心原则:switch 找到匹配的 case 后会一路执行下去,直到遇到 breakswitch 语句的结束大括号 。

-- 展开阅读全文 --
头像
织梦手机站为何不自动更新?
« 上一篇 今天
织梦QQ微信微博插件,如何无缝多平台同步?
下一篇 » 今天

相关文章

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

目录[+]