当前位置: 首页 > news >正文

【轻松学C:编程小白的大冒险】— 12.2 瑞士军刀出鞘:switch-case 的多分支江湖

在这里插入图片描述

  • 在编程的艺术世界里,代码和灵感需要寻找到最佳的交融点,才能打造出令人为之惊叹的作品。
  • 而在这座秋知叶i博客的殿堂里,我们将共同追寻这种完美结合,为未来的世界留下属于我们的独特印记。

【轻松学 C:编程小白的大冒险】— 12.2 瑞士军刀出鞘:switch-case 的多分支江湖

  • 一、switch-case:江湖救急神器
  • 二、语法拆解:军刀的组件
    • 1、刀柄:switch 表达式
    • 2、刀刃:case 分支
    • 3、刹车系统:break 语句
      • 3.1、break 深度解析
      • 3.2、危险示例
      • 3.3、最佳实践
    • 4、备用工具:default
  • 三、switch-case 的进阶玩法
    • 1、合并分支
    • 2、穿透效应
  • 四、switch-case vs if-else:兵器对决
  • 五、Mermaid 流程图:switch-case 的江湖路
  • 六、💡 小课堂:switch-case 的终极心法
    • 1、核心思想
    • 2、适用场景
    • 3、专业术语
  • 七、🤣 编程冷笑话
  • 八、✨ 今日金句


“代码江湖中,一把瑞士军刀胜过千行嵌套!”——《程序员兵器谱》


一、switch-case:江湖救急神器

  • 想象你是个客栈店小二,遇到客人点餐:
  • 点 1 号套餐 → 上宫保鸡丁
  • 点 2 号套餐 → 上鱼香肉丝
  • 点 3 号套餐 → 上麻婆豆腐
  • 如果用 if-else,代码会变成:
if (choice == 1) { ... }
else if (choice == 2) { ... }
else if (choice == 3) { ... }
else { ... }
  • 而用 switch-case,瞬间清爽:
switch (choice) {
    case 1: serve_dish("宫保鸡丁"); break;
    case 2: serve_dish("鱼香肉丝"); break;
    case 3: serve_dish("麻婆豆腐"); break;
    default: serve_dish("番茄炒蛋");
}
  • 江湖人称“瑞士军刀”,专治复杂分支!
case 1
case 2
case 3
default
Switch组件
宫保鸡丁
break
鱼香肉丝
麻婆豆腐
番茄炒蛋

二、语法拆解:军刀的组件

1、刀柄:switch 表达式

switch (expression) {  // 表达式结果必须是整型/字符型
    // ...
}
  • switch 后的表达式是整个语句的核心判断依据。
  • 其值会与下面 case 后的常量进行匹配。
  • 它就像是这把“瑞士军刀”的刀柄,掌控着整个操作的起始点。

2、刀刃:case 分支

case value:  // value 必须是常量表达式
    statement;
  • case 分支用于提供不同的选项。
  • switch 表达式的值与某个 case 后的 value 相等时,就会执行该 case 下的 statement
  • 每个 case 分支就如同军刀上的一片刀刃,针对不同的情况发挥作用。

3、刹车系统:break 语句

break;  // 关键!终止当前 case,跳出 switch

3.1、break 深度解析

  • 作用break 语句在 switch-case 结构中起着至关重要的作用。
  • 它就像是汽车的刹车系统。其主要功能是强制终止 switch 语句的执行,防止出现“case 穿透”现象。
  • 所谓“case 穿透”,就是当某个 case 分支被匹配后,如果没有 break 语句,程序会继续执行后续的 case 分支,直到遇到 break 或者 switch 语句结束。

3.2、危险示例

#include <stdio.h>

int main() {
    int num = 1;
    switch (num) {
        case 1:
            printf("1");  // 无 break
        case 2:
            printf("2");  // 穿透到这里
        default:
            printf("D");
    }
    return 0;
}
  • 在这个例子中,当 num 的值为 1 时。
  • 程序会先执行 case 1 中的 printf("1"); 语句。
  • 由于没有 break,程序会继续执行 case 2 中的 printf("2"); 语句。
  • 最后执行 default 中的 printf("D"); 语句。
  • 输出结果为 12D
  • 这显然不是我们期望的结果,可能会导致程序出现逻辑错误。

3.3、最佳实践

#include <stdio.h>

int main() {
    int num = 1;
    switch (num) {
        case 1:
            printf("执行了 case 1\n");
            break;  // 必须写!
        case 2:
            printf("执行了 case 2\n");
            break;
        default:
            printf("执行了 default\n");
    }
    return 0;
}
  • 在这个正确的示例中。
  • num 的值为 1 时,程序执行 case 1 中的 printf("执行了 case 1\n"); 语句。
  • 然后遇到 break 语句。
  • 跳出 switch 语句。
  • 不会再执行其他 case 分支。

4、备用工具:default

default:  // 可选,处理所有未匹配的情况
    default_action();
  • default 分支是可选的。
  • switch 表达式的值和所有 casevalue 都不匹配时。
  • 就会执行 default 分支下的语句。
  • 它就像是军刀上的备用工具,在其他刀刃都不适用的时候发挥作用。
  • 一般来说,default 分支可以不写 break,因为它已经是 switch 语句的最后一个分支了。

三、switch-case 的进阶玩法

1、合并分支

case 1:
case 2:  // 合并 1 和 2 的处理逻辑
    serve_fast_food();
    break;
  • 在这种情况下。
  • switch 表达式的值为 1 或者 2 时,都会执行 serve_fast_food() 函数。
  • 然后通过 break 跳出 switch 语句。
  • 这是一种主动利用 case 穿透特性的用法。
  • 让多个 case 共享同一段执行代码。

2、穿透效应

case 'A':
case 'a':  // 大小写不敏感处理
    score += 10;
    break;
  • 这里同样是利用了 case 穿透的特性。
  • 实现了大小写不敏感的处理。
  • switch 表达式的值为 'A' 或者 'a' 时,都会执行 score += 10; 语句。
  • 然后通过 break 跳出 switch 语句。

四、switch-case vs if-else:兵器对决

场景switch-caseif-else
固定值判断✅ 效率高(跳转表实现)❌ 逐条件检查
区间判断❌ 不支持✅ 灵活处理
类型转换❌ 表达式类型固定✅ 支持复杂类型

五、Mermaid 流程图:switch-case 的江湖路

case 1
case 2
case 3
default
开始
switch
判断
执行操作 1
跳出 switch
执行操作 2
执行操作 3
执行默认操作
结束

六、💡 小课堂:switch-case 的终极心法

1、核心思想

  • 通过跳转表实现快速分支,时间复杂度为 O(1)。
  • 也就是说,无论有多少个 case 分支。
  • switch 语句查找匹配分支的时间是固定的。
  • 不会随着分支数量的增加而增加。

2、适用场景

  • 枚举值判断(如状态机):当需要根据不同的枚举值执行不同的操作时,switch-case 非常合适。
  • 菜单选项处理:在处理用户的菜单选择时,使用 switch-case 可以让代码更加清晰易读。
  • 字符分类(如字母/数字判断):可以根据字符的不同类型进行不同的处理。

3、专业术语

  • Case 穿透(Fallthrough):在 switch 语句中,如果某个 case 分支没有 break 语句,程序会继续执行下一个 case 分支,这种现象称为 case 穿透。
  • 跳转表(Jump Table):switch 语句在底层实现时,通常会使用跳转表来快速定位匹配的 case 分支,从而提高执行效率。

七、🤣 编程冷笑话

Q:为什么 switch-case 讨厌 break?
A:因为它总想“穿透”所有 case,变成叛逆少年!

八、✨ 今日金句

“switch-case 就像自动贩卖机——输入选项,直接吐出结果!”

相关文章:

  • 有序数组的归并算法思路
  • 如何实现局域网内无痛访问Jupyter Notebook?
  • Linux中常用服务器监测命令(性能测试监控服务器实用指令)
  • oracle数据泵操作
  • 从零实现Json-Rpc框架】- 项目实现 - 服务端registrydiscovery实现
  • Spring boot 中QPS(Queries Per Second)与 TPS(Transactions Per Second)详细对比
  • struct 中在c++ 和c中用法区别
  • Hue:一个大数据查询工具
  • MSTP多域生成树
  • SpringBoot 7 种实现 HTTP 调用的方式
  • 阶段项目:Windows 服务器的组建与管理
  • java设计模式之桥接模式(重生之我在地府当孟婆)
  • 2025年SQL2API平台推荐:QuickAPI、dbapi 和 Magic API 介绍与对比
  • Kubernetes 入门篇之Master节点部署与安装
  • 基于modbusTcp连接Modbus Slave本地模拟服务通讯(C#编写ModbusTcp类库)(一)
  • VMware Workstation Pro下载链接
  • 【图像去噪】论文复现:灵感源自MAE!进一步解决BSN的局限性,破坏真实噪声的空间相关性!AMSNet的Pytorch源码复现,跑通源码,原理详解!
  • SQL Server:数据库镜像端点检查
  • 图解AUTOSAR_SWS_CANStateManager
  • STM32 FATFS - 在spi的SD卡中运行fatfs
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • 全国人大常委会启动食品安全法执法检查
  • 毕赣新作《狂野时代》入围戛纳主竞赛单元,易烊千玺舒淇主演
  • 九部门:对机动车特别是货车排放问题的监管将更加严格
  • 暴雨蓝色预警:南方开启较强降雨过程
  • 重磅金融政策密集发布!一文梳理这场国新办发布会