c++中如何使用switch语句_c++ switch case多分支判断方法【详解】

13次阅读

switch不能用于std::String,因其值无法在编译期确定且非整型;替代方案包括if-else链、std::map查表分发或c++20中手动哈希转整型后switch(需处理冲突)。

c++中如何使用switch语句_c++ switch case多分支判断方法【详解】

switch 语句在 C++ 中只能对整型(intcharenumshortlong 等)和可隐式转换为整型的类型进行判断,不能直接用于 std::stringFloatdouble 或自定义类。

switch 的合法 case 值必须是编译期常量

每个 case 标签后必须跟一个字面量、枚举值或 constexpr 变量,不能是变量或运行时计算结果:

int x = 5; switch (n) {     case x:  // ❌ 编译错误:case 表达式不是常量         break;     case 5:  // ✅ 合法         break;     case 'A': // ✅ char 字面量合法         break;     case MyEnum::VALUE: // ✅ 枚举值合法         break; }
  • case 后不能用函数调用(如 case func())、变量、数组下标表达式
  • C++17 起支持 constexpr 函数返回值作 case,但前提是该调用在编译期可求值
  • 多个 case 可共用一段代码(“贯穿”),但需显式加 break 阻止,否则会继续执行下一个 case

为什么 switch 不能用 string?替代方案有哪些

C++ 标准不支持 std::string 作为 switch 条件,因为其值无法在编译期确定,且内部存储非整型。常见误写:

std::string s = "hello"; switch (s) {  // ❌ 编译失败:no viable conversion from 'std::string' to 'int'     case "hello": // ❌ 字符串字面量类型是 const char[6],不是 std::string         break; }
  • 最直接替代是用 if-else if 链配合 == 比较
  • 若分支多且性能敏感,可用 std::map<:string std::function>> 或哈希表查表分发
  • C++20 起可借助 std::hash<:string>::operator() 手动映射为整数再 switch,但需处理哈希冲突,不推荐日常使用

fall-through 必须显式标注,否则触发 -Wimplicit-fallthrough 警告

现代编译器(GCC/Clang)默认对未加 break 且后续有 case 的情况发出警告。C++17 引入 [[fallthrough]] 属性明确表示这是有意为之:

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

switch (c) {     case '0': case '1': case '2':         digit_count++;         [[fallthrough]]; // ✅ 显式声明,避免警告     case 'a': case 'b': case 'c':         letter_count++;         break;     default:         other_count++;         break; }
  • 漏写 break 是常见 bug 来源,尤其复制粘贴 case 块时
  • [[fallthrough]] 必须放在 case 语句块末尾,且紧邻下一行 casedefault
  • 某些旧项目用 // fall through 注释代替,但不被编译器识别,无法抑制警告

真正容易被忽略的是:即使所有 case 都写了 break,如果忘了写 default,而输入值又不在任何 case 中,程序就会静默跳过整个 switch —— 这类逻辑漏洞往往在边界测试中才暴露。

text=ZqhQzanResources