0

0

c++中如何使用switch语句_c++多分支选择结构用法【入门】

穿越時空

穿越時空

发布时间:2026-03-12 15:04:50

|

716人浏览过

|

来源于php中文网

原创

c++中switch默认穿透执行,case后不加break会顺序执行后续case;string不可用因非整型,需if-else或哈希转整数;default必须存在以保障安全;case值须为编译期常量。

c++中如何使用switch语句_c++多分支选择结构用法【入门】

switch 里为什么 case 后面不加 break 就会“掉到下一个 case”

因为 switch 在 C++ 中默认是“穿透式执行”——一旦匹配到某个 case,就从那里开始顺序往下跑,直到遇到 break 或函数结束。这不是 bug,是语言设计,但新手常误以为它会自动跳出。

  • 没写 break 时,case 1:case 2: 的代码会连续执行,哪怕输入是 1
  • case(比如用于归类多个值)可以故意不加 break,但必须加注释说明意图,否则后期维护极易出错
  • Clang/GCC 开启 -Wimplicit-fallthrough 能警告这种行为;C++17 起可用 [[fallthrough]]; 显式标记“此处有意穿透”

char、int 能用 switch,string 为什么不行

switch 的条件表达式必须是整型或可隐式转为整型的类型(如 enumcharshort),而 std::string 是类对象,没有编译期确定的整型值,所以直接写 switch(s) 会报错:error: switch quantity not an integer

  • 想对字符串分支,得改用 if-else if 链,或 C++14 起用 std::map<:string std::function>></:string> 模拟跳转表
  • 如果字符串是固定枚举名(如 "start", "stop", "pause"),可先用 constexpr 哈希函数转成整数(如 consteval 实现 FNV-1a),再进 switch,但需确保哈希无碰撞
  • char 可以用,是因为它本质是小整数;unsigned char 同样合法,但 signed char 在某些平台可能因符号扩展导致意外匹配

default 分支不是可选的,而是安全底线

即使你“确定”所有输入都在已列 case 中,也必须写 default——否则当输入值超出预期(比如枚举新增了成员、读取外部数据出错、内存损坏),程序行为未定义,可能静默跳过逻辑或崩溃。

百宝箱
百宝箱

百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。

下载
  • default 不仅处理“漏掉的值”,更是防御性编程:可以加日志、断言或抛异常,例如 default: throw std::runtime_error("unexpected enum value: " + std::to_string(x));
  • 如果真想“什么也不做”,至少写 default: break;,避免被误认为遗漏
  • 某些静态分析工具(如 PC-lint、clang-tidy)会警告缺失 default,尤其在 switch 枚举类型时

case 标签必须是常量表达式,不能是变量或函数调用

case 后的值必须在编译期能确定,所以 case i:i 是变量)、case rand()%3:case MyClass::kValue:(若 kValuestatic constexpr)都会编译失败,错误信息类似:error: case label does not reduce to an integer constant

立即学习C++免费学习笔记(深入)”;

  • 枚举成员可用,但需确保是 enum class 或传统 enum 的显式整型值;C++11 起推荐用 enum class 避免隐式转换污染作用域
  • 宏定义的值(如 #define CMD_OPEN 1)可以,但不如 constexpr int CMD_OPEN = 1; 类型安全
  • 数组下标、sizeof 结果、字面量(42, 'a', 0xFF)都合法;但 std::numeric_limits<int>::max()</int> 不行,除非用 constexpr 版本

最麻烦的地方其实是:错误常在运行时才暴露——比如你忘了给某个 enum 成员赋值,它变成 0,又恰好和另一个 case 冲突,编译器不一定报错,但逻辑就乱了。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

119

2023.09.26

define的用法
define的用法

define用法:1、定义常量;2、定义函数宏:3、定义条件编译;4、定义多行宏。更多关于define的用法的内容,大家可以阅读本专题下的文章。

388

2023.10.11

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

switch语句用法
switch语句用法

switch语句用法:1、Switch语句只能用于整数类型,枚举类型和String类型,不能用于浮点数类型和布尔类型;2、每个case语句后面必须跟着一个break语句,以防止执行其他case的代码块,没有break语句,将会继续执行下一个case的代码块;3、可以在一个case语句中匹配多个值,使用逗号分隔;4、Switch语句中的default代码块是可选的等等。

569

2023.09.21

Java switch的用法
Java switch的用法

Java中的switch语句用于根据不同的条件执行不同的代码块。想了解更多switch的相关内容,可以阅读本专题下面的文章。

441

2024.03.13

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 11.1万人学习

C 教程
C 教程

共75课时 | 5.3万人学习

C++教程
C++教程

共115课时 | 21.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号