0

0

c++中如何使用switch语句_c++ switch用法案例

穿越時空

穿越時空

发布时间:2025-12-31 17:35:02

|

732人浏览过

|

来源于php中文网

原创

C++中switch仅支持整型和枚举类型,因case需编译期常量且类型必须匹配;std::string不满足该要求,应改用if-else或map查表。

c++中如何使用switch语句_c++ switch用法案例

在 C++ 中,switch 语句只能用于**整型或枚举类型**(包括 charintshortlongenum 及其带符号/无符号变体),不能直接用于 std::stringfloatdouble 或自定义类。

为什么 switch 不能用 string 直接匹配

C++ 标准规定 case 标签必须是编译期常量,而 std::string 对象无法在编译期求值。即使写成 switch (s) { case "hello": ... },也会编译失败 —— 因为字符串字面量是 const char*,类型不匹配,且不是同一类型常量。

  • switch 的控制表达式必须是整型提升后的类型(integral type
  • case 值必须是常量表达式(constexpr),且与 switch 表达式类型兼容
  • 常见误写:switch (str) { case "abc": ... }编译错误error: cannot convert 'const char*' to 'int'

替代 string 匹配的常用方法

当需要按字符串分支逻辑时,应改用 if-else if 链或 std::map/std::unordered_map 查表。C++17 起也可用 std::string_view + if constexpr 配合哈希(但非标准 switch 语义)。

  • 简单场景:用 if (s == "start") { ... } else if (s == "stop") { ... }
  • 高频调用且 key 固定:预计算 std::hash<:string_view>{}("key"),再 switch hash 值(需处理哈希冲突)
  • 更安全的做法:用 std::map<:string std::function>> 注册回调,避免重复比较

合法 switch 的典型用法与易错点

正确使用 switch 的关键是类型对齐、break 缺失风险、以及 default 的必要性。

知了追踪
知了追踪

AI智能信息助手,智能追踪你的兴趣资讯

下载

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

  • 支持的类型示例:charunsigned intenum class Status { OK = 0, ERR = 1 };
  • 常见疏漏:case 分支末尾忘记 break,导致“贯穿(fall-through)”——下一个 case 也会执行
  • C++17 引入 [[fallthrough]] 属性,显式标注有意贯穿,避免编译器警告
  • 强烈建议始终包含 default: 分支,哪怕只写 assert(false);throw std::runtime_error("unhandled case");
enum class Op { ADD, SUB, MUL };
Op op = Op::ADD;
switch (op) {
    case Op::ADD:
        result = a + b;
        break;  // 忘记这行就会继续执行 SUB 分支
    case Op::SUB:
        result = a - b;
        break;
    default:
        throw std::invalid_argument("unknown operation");
}

switch 和 if-else 的性能差异在哪

现代编译器(如 GCC、Clang、MSVC)对 switch 会自动优化为跳转表(jump table)或二分查找,前提是 case 值密集且范围可控;而长 if-else if 链通常是顺序比较,最坏 O(n)。

  • 适合 switch:几十个以内、值接近连续的整数(如状态码 0–10、HTTP 状态 200/201/400/404/500)
  • 不适合 switch:稀疏大整数(如 1、1000、1000000)、负数过多、或运行时才确定的值
  • 实测中,10 个以上分支且值分布良好时,switch 通常比等效 if-else 快 1.2–2x(取决于编译器和优化等级)

真正容易被忽略的是:switch 的“类型安全”假象——它不会做隐式转换检查。比如把 char 切片传给期望 intswitch,可能因符号扩展出错;又或者 enum 底层类型未显式指定,跨平台时大小不一致,导致 case 匹配失败。

相关专题

更多
string转int
string转int

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

312

2023.08.02

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

552

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

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

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

1435

2023.10.24

if什么意思
if什么意思

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

712

2023.08.22

switch语句用法
switch语句用法

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

518

2023.09.21

Java switch的用法
Java switch的用法

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

404

2024.03.13

scripterror怎么解决
scripterror怎么解决

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

184

2023.10.18

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

3

2025.12.31

热门下载

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

精品课程

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

共94课时 | 5.7万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.6万人学习

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

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