c语言学习笔记 switch case语句为什么要加break
先来看一个没有break的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | int main() { int a = 1; switch (a) { case 1: printf ( "1" ); case 2: printf ( "2" ); } } |
我们看一下它的汇编代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | switch (a) 0137181F mov eax,dword ptr [a] 01371822 mov dword ptr [ebp-0D0h],eax 01371828 cmp dword ptr [ebp-0D0h],1 0137182F je main+4Ch (0137183Ch) 01371831 cmp dword ptr [ebp-0D0h],2 01371838 je main+59h (01371849h) 0137183A jmp main+66h (01371856h) { case 1: printf ( "1" ); 0137183C push offset string "1" (01377B30h) 01371841 call _printf (0137104Bh) 01371846 add esp,4 case 2: printf ( "2" ); 01371849 push offset string "2" (01377B34h) 0137184E call _printf (0137104Bh) 01371853 add esp,4 |
可以看一下,case语句只是被编译成了一个具体的入口地址,但是并没有告诉程序怎么出来,从哪里出来,那么如果没有出口地址,那么程序就会按顺序执行下去,所以case2入口地址处的代码也被执行了。
如果是加了break语句之后就变成下面这样了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | switch (a) 00AC181F mov eax,dword ptr [a] 00AC1822 mov dword ptr [ebp-0D0h],eax 00AC1828 cmp dword ptr [ebp-0D0h],1 00AC182F je main+4Ch (0AC183Ch) 00AC1831 cmp dword ptr [ebp-0D0h],2 00AC1838 je main+5Bh (0AC184Bh) 00AC183A jmp main+68h (0AC1858h) { case 1: printf ( "1" ); 00AC183C push offset string "1" (0AC7B30h) 00AC1841 call _printf (0AC104Bh) 00AC1846 add esp,4 break ; 00AC1849 jmp main+68h (0AC1858h) case 2: printf ( "2" ); 00AC184B push offset string "2" (0AC7B34h) 00AC1850 call _printf (0AC104Bh) 00AC1855 add esp,4 |
break语句被编译成了一个jmp,跳转语句,那么再执行case1的过程中,自然会遇到jmp语句,而这个跳转语句正好把case2给跳过去了。
其实我觉得这种情况完全可以让编译器自动添加break语句,少一些人类的负担。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具