首页 > 你问我答 >

问 C 语言 switch 用法基本 多分支选择控制语句

2026-11-05 08:41:50
最佳答案

答

switch 是 C 语言里面专门用于多分支判断的选择结构语句,核心作用是根据一个整型表达式的取值,匹配对应的 case 分支,执行分支里面的代码,它可以替代层级很多的 if else if,让多档等值判断代码结构更加清晰。之所以会设计 switch,是因为当判断条件是同一个变量和多个固定常量做相等比较的时候,如果继续写很长一串 if else if,代码会比较臃肿可读性变差,switch 专门针对这种等值匹配场景优化,底层一般使用跳转表实现,分支数量很多的时候执行效率比连续 if else 更高。但是 switch 有硬性限制,括号里面表达式只能是整型字符型枚举类型,不能直接写浮点数,也不能写大于小于这类区间判断,这点和 if 语句有很大区别。使用的时候第一步编写 switch,括号里面放入整型表达式,第二步依次书写 case 加常量值,后面跟冒号,第三步每个分支内部编写业务代码,第四步按需添加 break 跳出 switch 结构,第五步可以增加 default 分支,所有 case 都匹配失败的时候执行 default 里面代码。整体逻辑就是计算 switch 括号内表达式的值,从上到下查找相等的 case 常量,找到之后从这个 case 位置开始顺序执行,如果没有 break 就会继续穿透执行后面所有 case 代码,直到遇到 break 或者整个 switch 结束,全部 case 都没有匹配就执行 default。

基础语法结构

switch (整型表达式)

{

case 常量 1:

分支代码 1

break;

case 常量 2:

分支代码 2

break;

case 常量 3:

分支代码 3

break;

default:

所有 case 都不匹配执行的代码

break;

}

语法要点说明

case 后面必须是整型或者字符型常量,不能是变量,也不能是带计算的动态表达式。

同一个 switch 内部,不允许出现重复的 case 常量,编译器会直接报错。

default 分支不是强制必须写,可以省略,省略之后所有 case 都不匹配,switch 就什么都不执行。

break 作用是终止当前 switch 结构,跳出整个 switch,不再继续向下执行。

基础示例代码

include

int main ()

{

int num = 2;

switch (num)

{

case 1:

printf ("选择 1\n");

break;

case 2:

printf ("选择 2\n");

break;

case 3:

printf ("选择 3\n");

break;

default:

printf ("无效选项 \n");

break;

}

return 0;

}

深度重点知识 穿透特性

穿透是 switch 最核心也最容易出错的特性,如果某个 case 后面忘记写 break,程序匹配成功之后,不会停止,会继续执行后面 case 里面的代码,不管后面 case 的值是否匹配。

举个例子

switch (num)

{

case 1:

printf ("1\n");

case 2:

printf ("2\n");

case 3:

printf ("3\n");

break;

}

如果 num 等于 1,输出会依次打印 1 2 3,这就是穿透效果。

合理利用穿透也是一种技巧,多个 case 需要执行同一段代码的时候,可以合并写法

case 1:

case 2:

case 3:

printf ("一二三 \n");

break;

意思就是值是 1 或者 2 或者 3,都执行同一段代码,不需要重复写相同代码。

switch 和 if else if 对比表

对比项目switchif else if
判断类型只能等值匹配支持区间判断 大小比较 逻辑组合
表达式类型仅限整型 字符 枚举任意真假表达式
执行效率分支多的时候跳转表效率更高顺序逐个判断
代码可读性固定选项菜单类逻辑更清晰复杂条件更灵活
穿透特性存在 case 穿透不存在穿透

常见误区清单

第一 误以为 case 后面可以写变量,case 必须是编译期就能确定的常量,不能写运行时才知道数值的变量。

第二 误以为 default 必须放在最后,语法允许 default 写在最前面或者中间,但是推荐写在末尾,可读性更好。

第三 误以为每个 case 都必须写 break,部分业务需要穿透的时候可以故意不写,但是绝大多数业务都要记得加 break 防止意外穿透。

第四 误以为 switch 可以判断小数,浮点数不能直接作为 switch 表达式,如果要对浮点数做分支,还是要改用 if 语句。

第五 误以为 default 一定会执行,default 只有所有 case 都匹配失败的时候才会运行,如果已经匹配某个 case 并且遇到 break,default 不会执行。

【常见问题】

问题 1 C 语言 switch 用法基本里面为什么会出现 case 穿透

回答 1 C 语言 switch 用法基本规则当中,如果 case 分支没有写 break,匹配成功之后程序会继续向下执行后续 case 代码,这个就是 case 穿透,忘记 break 是 switch 用法基本最常见 bug,合理设计也可以主动利用 switch 用法基本的穿透特性合并分支。

问题 2 C 语言 switch 用法基本能不能判断浮点数

回答 2 C 语言 switch 用法基本有类型限制,switch 括号表达式只能是整型字符型枚举类型,不能直接使用浮点数做分支判断,如果需要浮点数区间判断,就不能使用 switch 用法基本,要改用 if else 结构。

问题 3 C 语言 switch 用法基本里面 default 分支是必须写吗

回答 3 C 语言 switch 用法基本当中 default 不是强制要求,可以省略,省略之后如果所有 case 都没有匹配成功,switch 内部代码就不会执行,推荐写 default 可以处理非法输入,完善 switch 用法基本的健壮性。

问题 4 C 语言 switch 用法基本 case 后面可以写变量吗

回答 4 C 语言 switch 用法基本规定 case 后面必须是编译期常量,不能填写变量,变量的值运行时才确定,不符合 switch 用法基本语法要求,编译器会直接报错。

【免责申明】

本文内容基于 C 语言标准语法编写,代码示例仅用于学习演示,不同编译器对 switch 扩展支持存在细微差别,本文不覆盖所有极端边界场景,因为遗漏 break 常量书写错误造成程序逻辑异常,使用者自行承担相关风险。