优先用switch处理整型/字符/枚举的等值判断,否则必须用if-else;switch不支持浮点、字符串、布尔(语义不清)及范围/复合条件;漏break导致fallthrough,default非必需但建议添加以防遗漏;性能差异取决于值密度与编译器优化。

选 switch 还是 if-else,不看“习惯”或“风格”,只看表达式类型、判断逻辑和编译器行为——错用会导致编译失败、逻辑穿透或性能下降。
表达式只能是整型/字符/枚举?用 switch
如果你的判断依据是一个 int、char、enum 类型的变量,且只做「等于某个固定值」的判断,switch 是合法且高效的选择。
-
switch不接受double、float、std::string、bool(虽然bool可隐式转为int,但语义不清,不推荐) - 哪怕写成
switch(static_cast<int>(x))</int>强转,也不解决本质问题:浮点数比较本就不该用等值匹配 - 枚举类(
enum class)必须显式强转为底层类型,否则 GCC/Clang 会报错:error: switch condition has type 'Color' but no conversion to integral type
要判断范围、不等式或复合条件?只能用 if-else
一旦出现 >=、、<code>!=、&&、|| 或任何非常量表达式,switch 就无能为力。
-
case 90 ... 100:(GCC 扩展)不是标准 C++,跨平台项目禁用 -
case score >= 90:直接编译失败 ——case后必须是常量表达式 - 常见误写:
switch (x) { case (x > 5): ... }→ 编译器报错:case label does not reduce to an integer constant - 分数分段、权限组合判断、字符串前缀匹配等场景,
if-else if-else是唯一正解
多个等值分支且值密集?优先 switch,但注意 break 缺失
当有 4 个以上互斥的整型常量分支(如状态码 0、1、2、3),switch 通常生成跳转表,执行更快;但漏写 break 会触发 fallthrough。
- 没有
break的case会继续执行下一个case块,不是“bug”,是语言特性 —— 但多数情况属于逻辑错误 - C++17 起可用
[[fallthrough]]显式标注意图,避免编译器警告;没加又没触发 warning?说明你关了-Wimplicit-fallthrough -
default不是必须的,但没写且所有case都不匹配时,程序静默跳过整个switch块 —— 容易掩盖未处理的状态
性能差异真实存在,但别过早优化
在嵌入式或高频循环中,switch 对小范围整数的分支确实比长链 if-else if 快;但在普通业务逻辑里,差异微乎其微,可读性与正确性优先。
- 编译器对短链
if-else if(≤3 个分支)可能也内联优化为跳转表,实际性能未必差 - 用
switch处理稀疏值(如case 1:、case 1000:、case 999999:)反而可能退化为线性查找,不如if-else - 真正影响性能的是分支预测失败,而不是语法选择 —— 如果分支高度不可预测,换哪种写法都难提速
最容易被忽略的点:很多开发者把 switch 当作“更高级”的语法糖,硬套在不该用的地方,结果要么编译不过,要么运行时逻辑错乱。记住——switch 的本质是等值查表,不是多路 if 的替代品。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











