switch适用于单个整型或枚举变量匹配多个固定值;常见错误是类型错误(如string/float)、漏break导致贯穿、误用范围判断(c++标准不支持case 90...100)。

直接说结论:switch 适合处理「单个整型/枚举变量匹配多个固定值」的场景,用错类型、漏break、误判范围,是新手踩坑最集中的三处。
expression 必须是整型或枚举,不能是 string 或 float
编译器在编译期就要确定所有 case 值,所以 switch 的判断依据只能是能在编译时求值的整数类类型。这意味着:
-
char、int、unsigned short、enum(含enum class)都合法 -
std::string、float、double、const char*直接报错:error: switch quantity not an integer - C++17 起支持
constexpr字符串字面量的 间接 匹配(需配合std::string_view+ hash),但不是原生支持,别硬套
常见错误写法:switch (user_input) { case "start": ... } —— 这行不通,得改用 if-else 或查表映射。
case 后必须是常量表达式,且不能重复
case 标签不是运行时条件,而是编译期静态标签。它要求:
- 值必须是字面量或
constexpr变量,比如case 42:、case 'A':、case MyEnum::OK: - 不能是变量、函数调用、带运算的表达式,比如
case x + 1:、case get_code():都非法 - 多个
case值不能相同,否则编译报错:duplicate case value - 允许“空落”(fall-through):多个
case共享同一段逻辑,例如case 'a': case 'A':后不写break,可合并处理
注意:default 不是必须的,但强烈建议加上,哪怕只写个 assert(false) 或日志,避免静默失败。
漏 break 会导致贯穿(fall-through),不是 bug 是特性
break 的作用是跳出整个 switch 块。没有它,控制流会继续执行下一个 case 的代码,哪怕那个 case 的值根本不匹配——这是 C/C++ 标准行为,不是编译器 bug。
- 有意利用 fall-through 时(如连续数字分组),建议加注释,例如:
// fall through - 无意漏写
break是高频低级错误,尤其在复制粘贴case块后忘记补 - 现代编译器(如 GCC/Clang)加
-Wimplicit-fallthrough可警告,C++17 起还支持[[fallthrough]]属性显式标注意图
示例陷阱:case 1: do_something(); // missing break → runs case 2 too
switch 不适合做范围判断,别硬凑
很多人想用 switch 实现「分数 90~100 显示 A」这类逻辑,于是写出:
switch (score) {
case 90 ... 100: // ❌ C++ 不支持这种语法(GCC 扩展,非标准)
cout
<p>标准 C++ 中,<code>case</code> 只接受单个常量,不支持区间、不等式或通配。正确做法只有两种:</p>
- 用
if-else if链:清晰、通用、无歧义 - 把范围离散化为有限状态(如用
score / 10得到 0–10,再switch),但要注意边界(如 89.5 怎么处理)
强行用 switch 模拟范围,代码会变得冗长难维护,还容易漏覆盖(比如忘了 case 0 对应 0–9 分)。
真正要用好 switch,关键是守住它的设计边界:它是为「一个变量、几个确定值」而生的。越早放弃让它干它不该干的活,调试时间就越少。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











