0

0

c++ switch case语句用法_c++分支结构注意事项

穿越時空

穿越時空

发布时间:2026-01-03 19:00:14

|

524人浏览过

|

来源于php中文网

原创

C++中switch仅支持整型、枚举或可隐式转换为整型的常量表达式,不支持字符串;case值必须是编译期常量且互异;default建议置于末尾并兜底;fall-through需显式处理。

c++ switch case语句用法_c++分支结构注意事项

switch case 必须用整型或枚举,不能直接比较字符串

在 C++ 中,switch 的控制表达式只能是整型(intcharlong 等)、枚举类型,或能隐式转换为这些类型的常量表达式。C++ 标准不支持 std::stringconst char* 作为 switch 条件——编译器会直接报错,例如:error: switch quantity not an integer

常见误用场景:想根据命令名分发逻辑,比如 switch (cmd),其中 cmdstd::string。这时必须改用 if-else if 链,或预处理成哈希值(需确保无冲突)或枚举映射:

enum class Command { START, STOP, RESTART };
Command parse_command(const std::string& s) {
    if (s == "start") return Command::START;
    if (s == "stop")  return Command::STOP;
    if (s == "restart") return Command::RESTART;
    return Command::STOP;
}
// 后续可用 switch (parse_command(s)) { ... }

case 标签后必须是常量表达式,且不能重复

case 后的值必须在编译期可确定,不能是变量、函数调用或非常量表达式。例如 int x = 5; case x: 是非法的;case 3 + 4: 合法(因为是常量表达式);case sizeof(int): 也合法(sizeof 是编译期运算)。

重复的 case 值会导致编译错误,如:

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

switch (n) {
    case 1: ... break;
    case 1: ... // error: duplicate case value
}
  • 枚举成员名若未显式赋值,会从 0 开始自动递增,但多个枚举值可能意外相等(尤其用了 = 显式赋值后),务必检查
  • default 标签不是必需的,但强烈建议加上,避免遗漏分支导致未定义行为
  • 所有 casedefault 标签都属于同一作用域,不能在不同 case 中重复定义同名变量(除非加花括号引入新作用域)

忘记 break 会导致 fall-through,这是有意设计而非 bug

C++ 的 switch 默认“穿透”(fall-through):匹配到某个 case 后,若没遇到 break,会继续执行后续所有 case 语句,直到 switch 结束或遇到 break/return/throw。这和某些语言(如 Go)不同,是 C/C++ 的明确行为。

叮当好记-AI音视频转图文
叮当好记-AI音视频转图文

AI音视频转录与总结,内容学习效率 x10!

下载

容易踩的坑:

  • 本意只处理 case 2,却漏写 break,结果 case 3default 也被执行
  • 现代编译器(如 GCC/Clang)通常对无 breakcase 发出 -Wimplicit-fallthrough 警告,但默认不启用,建议在编译选项中加上 -Wimplicit-fallthrough=2
  • 若 fall-through 是故意的,应显式标注注释,如 // fall through,部分编译器能识别该注释并抑制警告

default 位置不影响执行逻辑,但影响可读性和维护性

default 可以放在任意位置(开头、中间、结尾),只要在 switch 代码块内即可。它只在没有任何 case 匹配时触发,与书写顺序无关。

不过实际工程中建议:

  • 始终把 default 放在最后,符合阅读直觉,也方便静态分析工具识别“是否覆盖所有枚举值”
  • default 在中间,后续 case 仍可能被 fall-through 执行,容易引发逻辑混乱
  • 对枚举类型使用 switch 时,即使你认为已列出全部值,也应保留 default 并至少加个 assert(false) 或日志,防止未来新增枚举值后漏处理

分支结构真正难的不是语法,而是状态覆盖是否完整、fall-through 是否可控、以及类型安全边界是否被无意突破。写完 switch 后,值得花 30 秒检查:所有 case 值是否互异?有没有漏 breakdefault 是否真能兜住异常输入?

相关专题

更多
string转int
string转int

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

314

2023.08.02

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

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

1437

2023.10.24

if什么意思
if什么意思

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

715

2023.08.22

switch语句用法
switch语句用法

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

523

2023.09.21

Java switch的用法
Java switch的用法

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

404

2024.03.13

scripterror怎么解决
scripterror怎么解决

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

184

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

270

2023.10.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

从零到实战:Python 编程系统入门专题
从零到实战:Python 编程系统入门专题

本专题面向零编程基础及初学者,系统讲解 Python 编程语言的核心知识与实战技巧。内容涵盖 Python 基础语法、数据结构、函数与模块、常用标准库、简单算法思维,以及真实应用场景下的小项目实战。通过循序渐进的学习路径,帮助读者快速建立编程思维,掌握 Python 在数据处理、自动化脚本及日常开发中的实际应用能力,为后续深入学习 Web 开发、数据分析或人工智能打下坚实基础。

2

2026.01.05

热门下载

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

精品课程

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

共32课时 | 3.3万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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