C++ switch语句怎么用 C++分支结构各种写法总结【语法】
发布时间 - 2026-01-24 00:00:00 点击率:次C++ switch语句仅支持整型或可隐式转为整型的类型,case值须为编译期常量且不重复,default建议添加,break需显式书写以防fall-through;case内定义变量必须用花括号限定作用域。
switch 语句的基本写法和必须遵守的规则
C++ 的 switch 不是万能的分支替代品,它只接受整型(int、char、enum、short 等)或可隐式转为整型的类型(C++17 起支持 constexpr 枚举类),不能直接用于 std::string、float 或自定义类。
每个 case 标签后必须是编译期常量表达式,且值不能重复;default 不强制出现,但强烈建议加上,否则遇到未覆盖的值时行为不可控。
-
break必须显式写,漏掉就会「贯穿(fall-through)」——这是最常见 bug 来源之一 -
case和default只是标签,不构成作用域;想在某个case中定义变量,得用花括号包起来 -
switch表达式本身不产生返回值,不能像 Python 的 match 那样赋值或参与表达式链
case 中定义变量的正确姿势
直接在 case 标签下写 int x = 42; 会报错:「jump to case label bypasses initialization」。因为跳转可能绕过初始化,违反 C++ 对象生命周期规则。
解决办法只有一个:用作用域块隔离。
switch (val) {
case 1: {
int x = 42; // ✅ 合法:x 的作用域仅限于此块
std::cout << x;
break;
}
case 2: {
std::string s = "hello"; // ✅ 同理
std::cout << s;
break;
}
}
注意:{} 不是可选的装饰,而是必需的语法结构;没有它,编译器会拒绝任何带初始化的局部变量声明。
替代 switch 的现代写法(C++17+)
当需要匹配字符串、多条件组合或运行时类型时,switch 失效,得换方案:
- 匹配
std::string:用if-else if链,或封装成std::map<:string std::function>>查表(适合固定键集) - 类型分支(如
std::variant):必须用std::visit+ lambda,switch完全无能为力 - 枚举类(
enum class):可以正常使用switch,但需确保所有枚举值都被case覆盖,或靠default捕获意外值
例如处理 std::variant,你只能写:
std::visit([](auto&& arg) {
using T = std::decay_t;
if constexpr (std::is_same_v) {
std::cout << "int: " << arg;
} 
else if constexpr (std::is_same_v) {
std::cout << "double: " << arg;
} else if constexpr (std::is_same_v) {
std::cout << "string: " << arg;
}
}, v);
容易被忽略的性能与兼容性细节
编译器对 switch 的优化高度依赖 case 数量和分布:少量离散值(如 3–5 个)通常编译为条件跳转;大量连续值(如 0–100)可能生成跳转表(jump table),极快;但若 case 值稀疏(如只有 1、1000、1000000),反而可能退化为二分查找或 if 链。
- 嵌套
switch是合法的,但可读性差,建议提取函数 - GCC/Clang 支持
[[fallthrough]]属性标记有意贯穿,避免警告;MSVC 用[[msvc::fallthrough]] - 不要在
case中 return 或 throw 后还写代码——控制流已中断,后续语句永远不可达,编译器可能警告甚至报错
真正麻烦的从来不是语法怎么写,而是忘记 break、误以为能切字符串、或者在没加作用域的情况下初始化变量——这三个点卡住的人最多。
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何批量查询域名的建站时间记录?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
如何用低价快速搭建高质量网站?
WEB开发之注册页面验证码倒计时代码的实现
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Windows10如何更改计算机工作组_Win10系统属性修改Workgroup
如何破解联通资金短缺导致的基站建设难题?
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel PHP版本要求一览_Laravel各版本环境要求对照
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
EditPlus 正则表达式 实战(3)
如何快速搭建高效香港服务器网站?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
大同网页,大同瑞慈医院官网?
Android GridView 滑动条设置一直显示状态(推荐)
如何在VPS电脑上快速搭建网站?
如何彻底删除建站之星生成的Banner?
如何在香港免费服务器上快速搭建网站?
公司网站制作价格怎么算,公司办个官网需要多少钱?
Laravel用户密码怎么加密_Laravel Hash门面使用教程
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
高性价比服务器租赁——企业级配置与24小时运维服务
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel如何与Inertia.js和Vue/React构建现代单页应用
做企业网站制作流程,企业网站制作基本流程有哪些?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理
如何自定义建站之星网站的导航菜单样式?
Mybatis 中的insertOrUpdate操作
开心动漫网站制作软件下载,十分开心动画为何停播?
HTML 中动态设置元素 name 属性的正确语法详解
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
如何为不同团队 ID 动态生成多个非值班状态按钮
jquery插件bootstrapValidator表单验证详解
Laravel Seeder怎么填充数据_Laravel数据库填充器的使用方法与技巧
如何选择可靠的免备案建站服务器?
如何快速查询域名建站关键信息?
原生JS实现图片轮播切换效果
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
使用spring连接及操作mongodb3.0实例
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
Laravel如何实现URL美化Slug功能_Laravel使用eloquent-sluggable生成别名【方法】


