讲师中心 微信公众号
AI工具推荐 视频效率加速

C++ switch语句怎么用 C++分支结构各种写法总结【语法】

大婷酱_9076

大婷酱_9076

发布时间:2026-01-24 11:41:02

|

453人浏览过

|

来源于php中文网

原创

C++ switch语句仅支持整型或可隐式转为整型的类型,case值须为编译期常量且不重复,default建议添加,break需显式书写以防fall-through;case内定义变量必须用花括号限定作用域。

c++ switch语句怎么用 c++分支结构各种写法总结【语法】

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++ 对象生命周期规则。

解决办法只有一个:用作用域块隔离。

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

Python Hardener
Python Hardener

通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。

下载
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>></:string> 查表(适合固定键集)
  • 类型分支(如 std::variant):必须用 std::visit + lambda,switch 完全无能为力
  • 枚举类(enum class):可以正常使用 switch,但需确保所有枚举值都被 case 覆盖,或靠 default 捕获意外值

例如处理 std::variant<int double std::string></int>,你只能写:

std::visit([](auto&& arg) {
    using T = std::decay_t<decltype(arg)>;
    if constexpr (std::is_same_v<T, int>) {
        std::cout << "int: " << arg;
    } else if constexpr (std::is_same_v<T, double>) {
        std::cout << "double: " << arg;
    } else if constexpr (std::is_same_v<T, std::string>) {
        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、误以为能切字符串、或者在没加作用域的情况下初始化变量——这三个点卡住的人最多。

热门AI工具

更多
SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
string转int
string转int

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

7259

2023.08.02

css中float用法
css中float用法

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

7447

2024.04.28

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

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

864

2025.10.23

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

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

6324

2023.10.24

switch语句用法
switch语句用法

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

1071

2023.09.21

Java switch的用法
Java switch的用法

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

1437

2024.03.13

java中break的作用
java中break的作用

本专题整合了java中break的用法教程,阅读专题下面的文章了解更多详细内容。

3200

2025.10.15

java break和continue
java break和continue

本专题整合了java break和continue的区别相关内容,阅读专题下面的文章了解更多详细内容。

847

2025.10.24

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

热门下载

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

精品课程

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn