我正在尝试这个:
#include<stdio.h>
int main() {
int i = 2;
switch(i) {
default:{
printf("Hi\n");}
case 1:
printf("Hi1\n");
case 2:
printf("Hi2\n");
}
}
输出是&#34; Hi2&#34;正如所料,但如果i = 3,
#include<stdio.h>
int main() {
int i = 3;
switch(i) {
default:{
printf("Hi\n");}
case 1:
printf("Hi1\n");
case 2:
printf("Hi2\n");
}
}
输出是 &#34;您好&#34; &#34; HI1&#34; &#34; HI2&#34;
程序如何输入其他不匹配的情况?我知道默认放置休息会解决这个问题。
为什么会这样? C规范中有没有提到这个?
答案 0 :(得分:3)
在C(和许多其他语言)中,案例只是被“跳”到的标签。一旦在选定的情况下开始执行,它就像正常情况一样流动。如果您希望在案例“块”结束时执行“停止”,则必须使用break
语句(或其他一些流控制语句):
switch(i) {
default:{
printf("Hi\n");}
break;
case 1:
printf("Hi1\n");
break;
case 2:
printf("Hi2\n");
break;
}
}
对于它的价值而言,在我看来,这是由语言设计者做出的一个不幸的决定,因为在执行一个或多个语句后执行下一个案例非常非常非常需要。但是,这就是语言的运作方式。
C#解决了这个问题,因为它使一个案例失效是非法的 - 在一系列语句结束时需要某种明确的流控制(break
或goto
)在一个案例中(除非它是交换机中的最后一个案例)。
答案 1 :(得分:2)
这是因为除非明确说明,否则代码会逐步执行每条指令。
在switch() { }
中,您必须明确。
考虑一下这个C支持的指令。这将是一个跳转表。在没有中断的情况下,在切换案例之后,每个分支下面都没有跳转。
答案 2 :(得分:0)
补充@alex,试试这个。
#include<stdio.h>
int main() {
int i = 2;
switch(i) {
default:{
printf("Hi\n");}
case 2:
printf("Hi2\n");
case 1:
printf("Hi1\n");
}
}