为何switch语句的case中可嵌套case?无匹配仍执行的原因
为啥这个switch里的case不管值多少都会执行?
嘿,我来给你拆解一下这个问题的核心——你其实误解了代码里的case结构,这根本不是嵌套switch,只是同一个switch里的case标签被放在了另一个case的代码块里而已!
首先搞懂switch的本质:匹配+贯穿执行
switch语句的工作逻辑是这样的:
- 先计算控制表达式的值(这里是
number1),找到对应的case标签; - 从匹配到的case位置开始顺序执行代码,直到遇到
break、return或者switch语句结束——这就是所谓的「fall-through(贯穿)」行为。
你的代码里,number1=100匹配到了case 100,而case 100的代码块里没有立即写break,所以程序会继续往下走,不管后面的case 200或者case 70000的值是什么。这些后续的case标签只是switch里的跳转标记,只有在switch初始匹配的时候会用到,一旦开始执行后,它们就和普通的代码行没区别了——程序只会顺着往下跑,直到碰到break。
为啥没编译错误?
C++标准允许在switch的任意代码块内放置case标签,只要标签的值是控制表达式类型的合法值(这里是int),而且没有重复的标签值就行。编译器不会管你把case标签放在哪个代码块里,它只会检查标签的合法性,不会判断你的逻辑是否“符合预期”。所以哪怕你把case 200改成case 70000,编译器也不会报错,因为这只是一个合法的int标签。
如果你想要真正的嵌套switch
要是你本来想写的是外层判断number1,内层判断number2,那得加上一个新的switch语句,比如:
int main(){ int number1 = 100, number2 = 200; switch(number1){ case 100:{ cout << " outer switch number is: " << number1 << endl; // 这里才是真正的嵌套switch,有自己的控制变量number2 switch(number2){ case 200:{ cout << "inner switch number is: " << number2 << endl; } break; } } break; } return 0; }
这样的话,内部的输出就只会在number2等于200的时候执行,不会因为外层的贯穿行为被触发了。
内容的提问来源于stack exchange,提问作者Alex24




