文章目录
1. case
后面不能是范围
C++ 中的 switch
语句的 case
标签必须是常量或常量表达式,不能是范围或变量。
int x = 5;
switch (x) {
case 1: // OK
case 1 + 2: // OK (常量表达式)
case x: // 错误,不能使用变量
case 2 ... 5: // 错误,不能使用范围 (C++ 没有范围语法)
break;
}
解决方案:如果需要检查范围,可以用 if-else
代替 switch
。
2. break
语句的重要性
switch
语句中的每个 case
标签后,通常需要一个 break
语句来防止"fall-through"(即执行完一个 case
后会继续执行下一个 case
)。
int x = 2;
switch (x) {
case 1:
std::cout << "One" << std::endl;
break; // 防止继续执行下一个 case
case 2:
std::cout << "Two" << std::endl; // 如果没有 break, 会继续执行下一个 case
case 3:
std::cout << "Three" << std::endl;
break;
}
注意:C++17 之后,允许显式使用 [[fallthrough]];
标记进行有意的 case
之间的 fall-through,但不推荐在不需要的地方省略 break
。
3. default
分支
最好始终在 switch
语句中添加 default
分支,以处理所有未明确列出的 case
,这能提高程序的健壮性,避免出现无法预测的情况。
switch (x) {
case 1:
std::cout << "One" << std::endl;
break;
default:
std::cout << "Default case" << std::endl; // 捕获所有未处理的情况
break;
}
注意:即使当前所有 case
都处理了,不需要的 default
也可以增加代码可读性。
4. switch
支持的数据类型
C++ 中 switch
语句只支持以下类型的表达式:
- 整型(
int
、char
、enum
等) - 枚举类型(C++11 之后支持强类型枚举)
enum Color { Red, Green, Blue };
Color c = Green;
switch (c) {
case Red:
std::cout << "Red" << std::endl;
break;
case Green:
std::cout << "Green" << std::endl;
break;
case Blue:
std::cout << "Blue" << std::endl;
break;
}
switch
不支持浮点类型 (float
、double
),也不支持字符串类型。
5. 变量作用域
在 switch
语句的 case
标签后定义变量时,必须显式用大括号 {}
包裹其作用域,以避免变量名冲突。
switch (x) {
case 1: {
int y = 10; // 需要用大括号包裹作用域
std::cout << y << std::endl;
break;
}
case 2: {
int y = 20; // 变量 y 在各自的作用域内合法
std::cout << y << std::endl;
break;
}
}
如果不使用大括号,可能会出现变量冲突问题。
6. 避免过多的 case
语句
switch
语句在处理过多 case
时,代码会变得难以维护。可以考虑使用其他结构(如 std::map
或 if-else
链)来代替 switch
,特别是在 case
标签过多或需要处理复杂的逻辑时。
7. 处理多重 case
条件
如果多个 case
需要执行相同的逻辑,可以将它们合并处理:
switch (x) {
case 1:
case 2:
case 3:
std::cout << "Value is 1, 2, or 3" << std::endl;
break;
default:
std::cout << "Other value" << std::endl;
break;
}
这种写法简洁有效,避免重复代码。