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语句,少一些人类的负担。

 

posted @   eatwhat  阅读(1134)  评论(0编辑  收藏  举报
编辑推荐:
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
阅读排行:
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(四):结合BotSharp
· Vite CVE-2025-30208 安全漏洞
· 《HelloGitHub》第 108 期
· MQ 如何保证数据一致性?
· 一个基于 .NET 开源免费的异地组网和内网穿透工具
点击右上角即可分享
微信分享提示