2014-03-31 89 views
0

之前我试图这样:开关盒壳体

#include<stdio.h> 

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

输出为 “HI2” 如预期的,然而若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"); 
    } 
} 

输出是 “Hi” 的 “Hi1” “Hi2”

程序如何进入其他不匹配的情况?我知道在默认情况下放置会解决这个问题。

为什么会这样? C规范中提到了这个吗?

+1

给我一个'break',你会吗? –

回答

2

在C语言(以及许多其他语言)中,这些情况只是标签被“跳转”到的。一旦执行开始在选定的情况下,它就像正常一样流动。如果你想在一个情况下,“块”的结尾执行到“停止”你必须使用break语句(或其他一些流量控制语句):

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

不管它的价值,在我看来这是这是语言设计者自从执行后进入下一个案例所做出的一个不幸决定,这是一个非常非常罕见的情况。然而,这是语言的工作方式。

C#通过使它脱离案例来解决这个问题是非法的 - 在案件的一系列陈述的末尾需要某种明确的流量控制(一个breakgoto)(除非它是交换机中的最后一种情况)。

2

这是因为除非明确声明,否则代码将逐步通过每条指令。

switch() { }中,您必须明确。

想想这个C所支持的指令。这将是一个跳转表。如果没有中断,每个分支下的之后都不会跳转到之后。

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