【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…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...