【C++】高级分析 switch 语句的应用

文章目录
- 💯前言
- 💯`switch` 语句的基本用法
- 语法结构
- 核心要点
- 实例演示
- 正确实现
- 期望输出
- 错误实现
- 错误输出
- 💯`if` 与 `switch` 语句的实现比较
- 使用 `if` 语句
- 使用 `switch` 语句
- 比较分析
- 💯错误分析与优化建议
- 常见错误
- 错误示例
- 输入 `6` 的输出:
- 问题原因
- 优化建议
- 💯扩展与总结
- `if` 与 `switch` 的高级应用
- 💯小结

💯前言
- 在 C++ 中,分支语句是实现条件逻辑的核心工具,能够根据评估的条件执行特定的代码块。本文深入分析了
if和switch语句,探讨其设计、实现及优化方法,同时为其在不同场景中的应用提供了实用建议。这种分析不仅帮助程序员掌握语言的特性,还能提升代码的效率与可维护性。
C++ 参考手册

💯switch 语句的基本用法
switch 语句是一种多分支控制结构,尤其适用于离散值的精确匹配。通过将表达式的值与多个 case 进行匹配,程序可以高效地执行相应的代码块。其结构简单且逻辑清晰,特别适合用于需要明确分支的场景。
语法结构
switch (expression) {case value1:// 执行代码块 1break;case value2:// 执行代码块 2break;...default:// 默认代码块break;
}
核心要点
expression: 表达式必须计算为整型类型。常见的数据类型包括int和char。case value: 每个case的值必须是常量表达式,例如数字或字符常量。break: 用于结束当前分支,防止“贯穿效应”导致后续case的代码被错误执行。- 缺少
break的情况: 如果省略break,程序会继续执行后续的所有分支,无论它们是否匹配。
实例演示
以下示例演示了如何使用 switch 语句实现一个简单的功能:计算一个整数除以 3 的余数,并根据余数输出相应的信息。
正确实现
#include <iostream>
using namespace std;int main() {int n = 0;scanf("%d", &n);switch (n % 3) {case 0:cout << "余数为 0" << endl;break;case 1:cout << "余数是 1" << endl;break;case 2:cout << "余数是 2" << endl;break;}return 0;
}

期望输出
输入 6 时,程序正确选择到 case 0,输出:
余数为 0
错误实现
若省略 break,程序会错误地执行所有后续的 case 代码,导致逻辑混乱:
#include <iostream>
using namespace std;int main() {int n = 0;scanf("%d", &n);switch (n % 3) {case 0:cout << "余数为 0" << endl;case 1:cout << "余数是 1" << endl;case 2:cout << "余数是 2" << endl;}return 0;
}

错误输出
输入 6 时,输出为:
余数为 0
余数是 1
余数是 2
由于缺少 break,程序从匹配的 case 0 开始顺序执行了所有后续分支。
💯if 与 switch 语句的实现比较
为了实现类似功能,我们可以使用 if 语句。if 是一种更通用的分支语句,适用于任何条件逻辑,特别是范围判断或复合条件。
使用 if 语句
#include <iostream>
using namespace std;int main() {int n = 0;cin >> n;if (n % 3 == 0)cout << "余数为 0" << endl;else if (n % 3 == 1)cout << "余数是 1" << endl;elsecout << "余数是 2" << endl;return 0;
}

使用 switch 语句
#include <iostream>
using namespace std;int main() {int n = 0;scanf("%d", &n);switch (n % 3) {case 0:cout << "余数为 0" << endl;break;case 1:cout << "余数是 1" << endl;break;case 2:cout << "余数是 2" << endl;break;}return 0;
}

比较分析
| 特点 | if 语句 | switch 语句 |
|---|---|---|
| 应用范围 | 适合复杂条件判断(如范围比较) | 适合离散值的精确匹配 |
| 表达式类型 | 支持任意条件表达式 | 仅支持整型表达式 |
| 代码可读性 | 嵌套条件可能降低可读性 | 结构清晰,适合多分支场景 |
| 效率 | 顺序判断条件,效率较低 | 直接跳转至匹配的分支,效率较高 |
💯错误分析与优化建议
常见错误
正如前文所述,在 switch 构造中如果缺少 break,会导致后续所有的 case 块被执行。
错误示例
#include <iostream>
using namespace std;int main() {int n = 0;scanf("%d", &n);switch (n % 3) {case 0:cout << "余数为 0" << endl;case 1:cout << "余数是 1" << endl;case 2:cout << "余数是 2" << endl;}return 0;
}

输入 6 的输出:
余数为 0
余数是 1
余数是 2
问题原因
缺少 break 导致“贯穿效应”,程序从匹配的 case 开始,依次执行后续所有分支。
优化建议
- 在每个
case块后加入break,以避免“贯穿效应”。 - 使用
default分支处理未匹配的情况,确保分支逻辑覆盖全面。 - 在复杂的逻辑判断中,优先考虑
if,以便更灵活地处理各种条件。
💯扩展与总结
if 与 switch 的高级应用
-
分支逻辑:
- 对于大量离散值,
switch提供了更好的可读性和可维护性。 - 对于范围或复合条件,
if更具灵活性。
- 对于大量离散值,
-
性能考虑:
switch构造优化了跳转表,直接访问匹配的分支,提升了运行效率。if语句逐一评估条件,在复杂情况下可能带来较高的计算开销。
-
代码维护性:
- 对于处理大规模的离散值匹配,
switch提供了更高的可读性。 if在处理复杂逻辑表达式时表现出更强的适应能力。
- 对于处理大规模的离散值匹配,
-
错误防范:
- 使用工具进行代码静态分析,帮助识别可能遗漏的
break或逻辑漏洞。 - 在代码审查过程中,明确标注每个
case的功能,以便团队成员更好地理解和维护代码。
- 使用工具进行代码静态分析,帮助识别可能遗漏的
💯小结
-

switch语句在多分支场景中表现出色,但需要注意正确使用break以避免“贯穿效应”。它适用于基于离散值的条件判断,尤其是在处理大量分支的情况下能提升效率和代码可读性。 -
if语句在面对复杂的逻辑判断和范围检查时,是更为灵活的工具。无论是与其他条件语句的嵌套使用,还是处理动态逻辑,它都表现出色。 -
程序员应根据具体场景选择合适的工具,在代码效率与维护性之间取得平衡。对于大型项目,结合静态分析工具和代码审查,可以进一步提升代码质量,减少潜在问题。

![]()
![]()
![]()
![]()
![]()
![]()
![]()
相关文章:
【C++】高级分析 switch 语句的应用
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯switch 语句的基本用法语法结构核心要点实例演示正确实现 期望输出错误实现错误输出 💯if 与 switch 语句的实现比较使用 if 语句使用 switch 语句比较分析 &am…...
活动预告 | Surface 来了#11:Windows 11 AI+ PC,释放 AI 办公设备的无限潜能
课程介绍 欢迎来到 Surface 来了第 11 期节目。 今年 5 月底,微软推出了专为 AI 体验而设计的全新 Windows PC 品类:Windows 11 AI PC。 微软通过 Windows 11 AI PC,进一步强调了 NPU 在运行设备端 AI 功能的重要性。并要求符合这一品类的…...
php基础:正则表达式
1.正则表达式 正则表达式是用于描述字符排列和匹配模式的一种语法规则。它主要用于字符串的模式分割、匹配、查找及替换操作。到目前为止,我们前面所用过的精确(文本)匹配也是一种正则表达式。 在PHP中,正则表达式一般是由正规字…...
go语言压缩[]byte数据为zlib格式的时候,耗时较多,应该怎么修改?
在Go语言中使用compress/flate包来实现Zlib格式的压缩时,如果发现压缩耗时较多,可以考虑以下几个优化方向: ### 1. 压缩级别 默认情况下,compress/flate包中的NewWriter函数使用的是默认压缩级别(BestSpeed和BestComp…...
[机器学习]AdaBoost(数学原理 + 例子解释 + 代码实战)
AdaBoost AdaBoost(Adaptive Boosting)是一种Boosting算法,它通过迭代地训练弱分类器并将它们组合成一个强分类器来提高分类性能。 AdaBoost算法的特点是它能够自适应地调整样本的权重,使那些被错误分类的样本在后续的训练中得到…...
深入了解Spring
目录 Spring基础 什么是Spring框架? Spring 包含的模块有哪些? Core Container AOP Data Access/Integration Spring Web Messaging Spring Test Spring,Spring MVC,Spring Boot 之间什么关系? Spring基础 什么是Spring框架? Sp…...
jar 包如何下载
maven官网:https://mvnrepository.com/ 点击搜索,找对应搜索结果点击...
ESlint代码规范,手动与自动修复
规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 可看到是main.js文件报错分别是第三行第30个字符,以及第七行第一个字符 后面则是规范说明,可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …...
利用编程获得money?
在当今数字化时代,编程技能为人们开辟了众多赚钱途径。无论你是编程新手还是经验丰富的开发者,都能在广阔的市场中找到适合自己的盈利方式。以下是一份详细的用编程赚钱指南。 一、自由职业平台 像 Upwork、Freelancer 和 Fiverr 等知名自由职业平台&am…...
设计规规范:【App 配色】
文章目录 引言I App 配色组成色彩象征 & 联想II 知识扩展设计流程图UI设计交互设计UI交互设计引言 设计规范,保持设计一致性,提高设计效率。宏观上对内统一,管理与合作变得容易。 按类型管理颜色、文本样式、图标、组件(symbol)。 蓝湖设计规范云 https://lanhuapp.co…...
react 使用 PersistGate 白屏解决方案
我在全局添加 PersistGate 组件后报错了 报错信息如下: Uncaught Error: A component suspended while responding to synchronous input. This will cause the UI to be replaced with a loading indicator. To fix, updates that suspend should be wrapped wi…...
F5中获取客户端ip地址(client ip)
当F5设备对其原始设置上的所有IP地址使用NAT时,连接到poo成员(nodes、backend servers)的出站连接将是NAT IP地址。 pool 成员(nodes、backend servers)将无法看到真实的客户端 ip地址,因为看到的是F5上的…...
Maven(生命周期、POM、模块化、聚合、依赖管理)详解
目录 Maven构建项目的生命周期 Maven的常用命令 POM 依赖管理 依赖导入 依赖范围设置 依赖版本维护 依赖传递 依赖冲突 解决依赖冲突的方法 使用maven提供的依赖调节原则 排除依赖,排除依赖的jar包 锁定版本 项目模块化 Maven项目的继承 Maven项目…...
电力场景绝缘子缺陷识别分割数据集labelme格式1099张3类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):1099 标注数量(json文件个数):1099 标注类别数:3 标注类别名称:["brokenpart","brokeninsulator…...
【k8s集群应用】Kubernetes 容器编排系统
文章目录 Kubernetes 容器编排系统背景与发展Kubernetes 基本概念Kubernetes 集群架构与组件Kubernetes 核心组件Master 组件配置存储中心Node 组件 Kubernetes核心概念1. Pod2. Pod控制器3. Label与Label选择器4. Service5. Ingress6. Volume7. Name与Namespace K8S创建Pod资源…...
Unity3D仿星露谷物语开发2之工程初始化
1、依赖包安装 进入【Window -> Package Manager】 安装如下插件: 1)Cinemachine 它是一套专门控制Unity Camera的模块,适用于各种游戏场景中物体的移动变化,解决了许多关于摄像机间的复杂控制,混合,…...
Kafka篇之参数优化进而提高kafka集群性能
1. Kafka性能优化分类 Kafka集群的性能优化涉及多个方面,包括硬件资源、网络、配置文件参数等。 调优目标通常是为了提高吞吐量、减少延迟、提升稳定性和故障恢复能力。 以下是Kafka集群调优的常见策略,以及调优后的配置文件示例。 1. 硬件资源调优 C…...
关于SAP Router连接不稳定的改良
这个也是网上看来的,之前在用的时候也在想是不是建立一个长连接,就不至于断线。今天正好看到。 关于SAP Router连接不稳定的改良 我们在使用SAPRouter时经常会碰到断线,其发生原因有很多,如:网络不稳定、操作间隔时间…...
使用pygame做游戏(2):2048游戏的进一步改造,以失败告终
前言 受《Python树莓派编程从零开始》里的示例启发,我决定将上篇的2048游戏进行“面向对象化”改造。 这次除了要建立一些对象,还要能有移动效果,并能显示中文。 另外我还发现一个bug:方块放满了不代表输了,还要检查能…...
【CSS in Depth 2 精译_078】12.6 调整字间距,提升可读性 + 12.7 本章小结
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 12 章 CSS 排版与间距】 ✔️ 12.1 间距设置 12.1.1 使用 em 还是 px12.1.2 对行高的深入思考12.1.3 行内元素的间距设置 12.2 Web 字体12.3 谷歌字体12.4 font-fac…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
React父子组件通信:Props怎么用?如何从父组件向子组件传递数据?
系列回顾: 在上一篇《React核心概念:State是什么?》中,我们学习了如何使用useState让一个组件拥有自己的内部数据(State),并通过一个计数器案例,实现了组件的自我更新。这很棒&#…...
Java中HashMap底层原理深度解析:从数据结构到红黑树优化
一、HashMap概述与核心特性 HashMap作为Java集合框架中最常用的数据结构之一,是基于哈希表的Map接口非同步实现。它允许使用null键和null值(但只能有一个null键),并且不保证映射顺序的恒久不变。与Hashtable相比,Hash…...
