switch仅接受整型、字符型和枚举型表达式;int、short、long long、char、unsigned char、enum及enum class合法,而std::string、float、double、const char*不合法。

switch只接受整型、字符型和枚举型表达式
编译器在编译期就要确定所有 case 值,所以 switch 的控制表达式必须是能在编译时求值的整数类类型。这意味着:int、short、long long、char、unsigned char、enum 和 enum class 都合法;但 std::string、float、double、const char* 会直接报错:error: switch quantity not an integer。
常见误用包括:
- 拿
std::string直接进switch(C++ 标准至今不支持) - 用
float score = 92.5;做判断依据(哪怕值是整数,类型仍是float) - 试图写
case "start":(字符串字面量不是整型常量)
适合「多个固定等值判断」的场景
当你要判断一个变量是否等于若干个明确、互斥的整数值时,switch 比一长串 if (x == 1) ... else if (x == 2) ... 更清晰、更高效。典型例子包括:
- 菜单选项编号(
1:保存,2:加载,3:退出) - 星期几(
1→周一,2→周二……) - 状态码(
HTTP_OK、HTTP_NOT_FOUND等枚举值) - ASCII 字符分类(
'a'、'A'、'0'等)
注意:它不适用于范围判断(比如“分数 ≥ 90”),也不适合带逻辑运算的条件(如 (a > 5) && (b )——这类必须用 <code>if-else if。
为什么漏 break 是高频错误
switch 执行逻辑是「定位入口 + 向下贯穿」,不是「匹配即停」。一旦进入某个 case,就会连续执行后续所有语句,直到遇到 break 或 switch 结束。
例如:
int x = 1;
switch(x) {
case 1:
cout
<p>输出是 <code>onetwo</code>,而非仅 <code>one</code>。容易踩坑的地方:</p>
- 忘记加
break,尤其在调试时临时注释掉某分支后 - 误以为
case是独立作用域(实际共享同一作用域,变量重复定义会报错) - 想利用穿透写「fall-through」逻辑,但没加注释,导致后续维护者误删
break
和 if-else if 的性能与可读性取舍
分支数少(≤2)时,if-else if 更灵活、写起来也快;分支数 ≥3 且全是等值判断时,switch 优势明显:
- 编译器可能生成跳转表(jump table),执行效率更高(尤其分支多时)
- 所有候选值集中罗列,一眼看清所有合法输入
- 若漏写某个
case,配合default容易发现逻辑缺口
但要注意:default 不是必须的,不写也不会报错;可读性优势只在「候选值确实固定且有限」时成立——如果 case 值来自宏或常量定义,而这些定义散落在不同头文件里,反而会增加理解成本。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











