switch语句不加break会发生什么事情?c/c++

707 阅读2分钟

先上题目:

0354b3ecc33286792cbef254b680932.png

无奖问答:以上代码会输出什么? 一开始我以为是2,但是结果是23。

为什么呢?因为default里少了break语句;但是为什么case 1也会执行呢?switch语句不是和if-else语句等同吗?如果一样的话那不是等于

if (i == 0) {
		printf("0");
	}
	else if (i == 1) {
		printf("3");
	}
	else {
		printf("2");
	}
        

i=2,那么在执行到case=1的时候不是应该先判断i==1,再执行printf("3")吗?带着这个疑问,我在csdn上找到了答案,原文switch-case语句不加break为什么后面的语句可以继续执行?_c# switch case后 没有break-CSDN博客

image.png 简而言之,就是汇编之后switch(i)会发生跳转,跳到相应的代码块执行。其他的代码块没有跳转功能,除非加了break。

到这里的时候我以为我已经理解了原理,但是我朋友又问我另外一个问题

e308f948d129e770ffadfc5552f8bc9.png

这个显示什么?我以为是23,因为它会顺序执行嘛,发现i!=0不执行,执行default再执行case 1。结果输出是3!没有2.汇编不是顺序执行吗? 为了搞懂这个问题,我尝试和之前那篇博客一样尝试在编译器里面看汇编代码。

ed3fe02ab986d3b9733d0588c4d42a2.png

18894b9d8db13383a23d80d4b937dfe.png

结果:

image.png 注意看最上面的代码:

image.png 汇编的时候它是先集中做判断条件,再跳转执行的。而且在判断条件的时候,即使写代码的顺序是乱的(default没有在最后),它汇编的时候也会按顺序来判断比较,default会在最后判断比较。所以i会先和0,1比较,之后跳转到case 1的代码块,然后顺序执行,所以不会执行default的代码。

这次学习要求会一点计组,汇编第一次让我感觉学习的知识很有用。至少在摸清原理上面帮助了我很多。汇编界面第一列是指令的十六进制地址,第二列我记得是指令的名称作用功能之类的,第三列记得是和寄存器这些有关。感觉考研学的计组没算白学。汇编则是当时编译技术的实验要求写编译器前端的时候需要用到,老实说,当时也不是很懂,感觉还是考研的时候学会的。