欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break

发布时间:2023/11/30 42 豆豆
生活随笔 收集整理的这篇文章主要介绍了 c语言switch为什么要加break,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语句,少一些人类的负担。

总结

以上是生活随笔为你收集整理的c语言switch为什么要加break,c语言学习笔记 switch case语句为什么要加break的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。