为了账号安全,请及时绑定邮箱和手机立即绑定

无break不需要判断case吗

完全就是扯,即使没有break,执行case3的时候不先要判断3是不是num吗?

正在回答

2 回答

题主这个问题很经典,这其中涉及到编译的问题。事先声明,接下来我的回答都是我的个人理解,肯定会有不准确的表述。

咱们现在看到的switch结构,一旦经过编译器处理后,指令的顺序就大大不一样了,编译器会把所有的case判断转换成汇编指令放到一起,把分别执行的语句也放到一起,加载到内存中就是两块连续的存储空间,一块放判断,一块放动作。两块怎么联系起来?通过给动作空间进行标号,程序执行时,(注意,这里的汇编指令就是判断+跳转),先判断,一旦判断符合,跳转到相应标号的动作区域执行动作,如果判断不符合,接着下一条判断(判断+跳转)。再说说动作区域的执行,要知道,动作区域的执行也是从上往下一条条顺序执行的,所以,如果相应的动作后面不加break,就会顺序执行下一条动作。我们可以理解成break被转换成一条跳转指令放到了动作区域里,只不过break不需要判断跳转,它是直接跳转,跳转的目的地也是动作区域的一个标号,end,跳出。

列几个网址,有时间看看。PS,别钻牛角尖。

http://book.51cto.com/art/201312/421963.htm

http://blog.csdn.net/lixiangminghate/article/details/71171804?utm_source=gold_browser_extension

这个很好,注释很完美。

http://blog.sina.com.cn/s/blog_5526d40f0100orrc.html    这个文章后半段感觉不好,貌似作者自己在弄编译器。


0 回复 有任何疑惑可以回复我~

首先是判断”num是不是3“而不是判断”3是不是num“
其次,从实现的角度,一旦任何一个case匹配了,他就会顺序向下执行”后大括号前的所有操作“,而忽略case和default

0 回复 有任何疑惑可以回复我~
#1

慕圣5475749 提问者

这也功能完全可以完善一点。改成执行case后就默认跳出。不需要break。不知道最初语言开发者怎么想的。这个在C里面就是这样。但是我觉得这是个bug类的存在。一直存在了五十年
2017-08-10 回复 有任何疑惑可以回复我~
#2

decho 回复 慕圣5475749 提问者

避免写重复代码啊,如果多个case的操作是递进关系怎么办→_→。。。 比如 case1:do1 case2:do2 case3:do3 default:clean 如果你默认有break就变成 case1:do1;do2;do3;clean case2:do2;do3;clean case3:do3;clean default:clean 是不是很丑很不方便
2017-08-10 回复 有任何疑惑可以回复我~
#3

慕圣5475749 提问者

谢谢!是有这种情况。比如计算个税的情况确实需要递进
2017-08-10 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

无break不需要判断case吗

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信