c语言为什么设计switch-case不能逻辑判断,c语言学习笔记 switch case语句为什么要加break...

先来看一个没有break的例子:

int main()

{

int a = 1;

switch (a)

{

case 1:

printf("1");

case 2:

printf("2");

}

}

我们看一下它的汇编代码:

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语句之后就变成下面这样了:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值