c++中switch语句怎么写_c++分支选择语法【入门】

2次阅读

switch语句必需以整型或枚举表达式开头,每个case后跟唯一常量值,必须用break防贯穿,default可选但建议添加且不可带条件。

c++中switch语句怎么写_c++分支选择语法【入门】

switch 语句的基本写法和必需结构

c++ 中,switch 不是可有可无的语法糖,它要求每个 case 标签后必须跟一个常量表达式(编译期能确定的整型、枚举或 constexpr 字符),且所有 case 值必须互不相同。漏掉 break 会导致「贯穿(fall-through)」,这不是 bug,是设计行为——但绝大多数时候你得主动写 break 来阻止它。

基本骨架如下:

switch (expr) {     case 1:         // 语句         break;     case 2:         // 语句         break;     default:         // 可选,但强烈建议加上 }
  • expr 类型必须是整型、枚举,或能隐式转换为整型的类型(比如 charshort 可以;Floatstd::String 不行)
  • default 不必放在最后,但习惯上放末尾;没有 defaultexpr 值不匹配任何 case,整个 switch 就静默跳过
  • 每个 casedefault 后面可以跟多条语句,不需要大括号(但加了也不报错)

常见错误:忘记 break、用变量当 case 值、default 写错位置

新手最常踩三个坑:一是写了 case 5: 却没写 break,结果执行完 case 5 直接掉进 case 6;二是试图写 int x = 3; case x: —— 编译直接报错 Error: case label does not reduce to an Integer constant;三是把 default: 写成 default():default {},这根本不是合法语法。

  • 编译器通常对「无 breakcase」发警告(如 GCC 的 -Wimplicit-fallthrough),别忽略它
  • C++17 起可用 [[fallthrough]]; 显式标注“此处故意贯穿”,既消警告又表意图
  • default 后面不能跟条件判断,它只是一条兜底分支,不是 else if

switch 和 if-else 的实际取舍

别一看到多分支就本能选 switch。它本质是编译器优化的跳转表(jump table)或二分查找,只在「离散、密集、值域不大」的整数场景下比 if-else 快。如果条件是 if (x > 10 && x 、if (s == "start")if (ptr != nullptr)switch 根本没法写。

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

  • 支持 constexpr 字符串的 C++20 仍不支持 switchstd::string 比较(只能靠哈希或 if 层层套)
  • 枚举类型配合 switch 是安全用法,但记得开启编译器检查(如 Clang 的 -Wcovered-switch-default)确保所有枚举值都被处理
  • 嵌套 switch 很少见,多数时候说明逻辑该拆函数了

case 中定义变量要加花括号

这是容易被忽略的细节:如果某个 case 分支里需要定义局部变量,必须用 {} 包裹,否则编译失败。

switch (x) {     case 1:         int y = 10;  // ❌ 错误:跳过初始化语句         break;     case 2:         {           // ✅ 正确:作用域块             int z = 20;             std::cout << z;         }         break; }

原因在于:case 标签不是作用域边界,C++ 不允许跳过带初始化的变量定义。加花括号就创建了新的作用域,绕开限制。

实际项目中,这种写法虽然合法,但频繁出现往往意味着这个 switch 承担了太多职责,值得重新评估是否该拆成独立函数或改用多态

text=ZqhQzanResources