慕圣5475749
2017-08-09 19:05
完全就是扯,即使没有break,执行case3的时候不先要判断3是不是num吗?
题主这个问题很经典,这其中涉及到编译的问题。事先声明,接下来我的回答都是我的个人理解,肯定会有不准确的表述。
咱们现在看到的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 这个文章后半段感觉不好,貌似作者自己在弄编译器。
首先是判断”num是不是3“而不是判断”3是不是num“
其次,从实现的角度,一旦任何一个case匹配了,他就会顺序向下执行”后大括号前的所有操作“,而忽略case和default
PHP入门篇
455957 学习 · 6306 问题
相似问题