在c中切换案例,在案例之前默认

时间:2014-03-31 03:23:18

标签: c switch-statement

我正在尝试这个:

#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规范中有没有提到这个?

3 个答案:

答案 0 :(得分:3)

在C(和许多其他语言)中,案例只是被“跳”到的标签。一旦在选定的情况下开始执行,它就像正常情况一样流动。如果您希望在案例“块”结束时执行“停止”,则必须使用break语句(或其他一些流控制语句):

switch(i) {
    default:{
        printf("Hi\n");}
        break;
    case 1:
        printf("Hi1\n");
        break;
    case 2:
        printf("Hi2\n");
        break;
    }
}

对于它的价值而言,在我看来,这是由语言设计者做出的一个不幸的决定,因为在执行一个或多个语句后执行下一个案例非常非常非常需要。但是,这就是语言的运作方式。

C#解决了这个问题,因为它使一个案例失效是非法的 - 在一系列语句结束时需要某种明确的流控制(breakgoto)在一个案例中(除非它是交换机中的最后一个案例)。

答案 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");
    }
}