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

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...

华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...