2011-04-25 60 views
1

民歌,C - Tricky Switch Case工作..!

最近开始学习C.
卡住了一点。它关于switch-case语句的工作。

下面的代码:

#include<stdio.h> 

int main() { 
     int i=4; 
     switch(i) { 

       default :  
         printf("%s","Default"); 
       case 0:   
         printf("%s","Case 0"); 
       case 1:   
         printf("%s","Case 1"); 
       case 2:   
         printf("%s","Case 2"); 

     return 0; 
     } 
} 

我个人认为,“Default”应打印,因为它不与任何情况下的值相匹配。
但是,当我在Turbo C的运行代码,我观察到的是这样的:

Default 
Case 0 
Case 1 
Case 2 

即使在这里观察到相同的:http://www.ideone.com/pFh1d

问题是什么?这是编译器问题或我的代码中的任何错误?


编辑:

PS:错这有什么,如果在所有我必须先写默认情况。有什么伤害?

但是,一旦编译器知道它必须执行默认语句,为什么我们需要在默认情况下的语句之后放置一个break语句?

+4

你的休息地点在哪里?声明? – 2011-04-25 07:33:47

+0

它是否预计每个病例会中断? – 2011-04-25 07:34:54

+0

它不会但它会执行匹配的所有情况,直到它移出或发现中断 – 2011-04-25 07:40:45

回答

6

该switch语句将跳转到相应的casedefault,然后代码将继续,直到下一个break语句。

由于您的代码没有break,它将从default:开始,只需继续执行以下所有语句即可。在编写类似的条件时,这有时会是一个有用的技巧,但通常缺少break语句会导致混淆。

最后return也是在错误的地方,它应该在switch语句之后。

修改如下。

 int i=4; 
     switch(i) { 

       default :  
         printf("%s","Default"); 
         break; 
       case 0:   
         printf("%s","Case 0"); 
         break; 
       case 1:   
         printf("%s","Case 1"); 
         break; 
       case 2:   
         printf("%s","Case 2"); 
         break; 

     } 
     return 0; 
1

它与defaule相匹配,以便默认值,然后由于缺席break;所有的情况下,执行

使其如下得到您预期的结果

default :  
         printf("%s","Default"); break; 
       case 0:   
         printf("%s","Case 0");break; 
       case 1:   
         printf("%s","Case 1");break; 
       case 2:   
         printf("%s","Case 2");break; 
+0

但是,一旦编译器知道它必须执行默认语句,为什么我们需要在默认情况下的语句之后放置一个break语句? – 2011-04-25 07:38:57

+0

@herbalessence查看开关案例,并在那里解释。 http://visualcplus.blogspot.com/2006/03/lesson-12-switch-case-break-and.html – zengr 2011-04-25 07:41:03

+0

另请参阅[this](http://www.cprogramming.com/tutorial/c/lesson5。html) – 2011-04-25 07:43:01

1

switch声明在C语言中体是单个连续复合语句有几个入口点。每个case/default标签是入口点。您可以在任何入口点输入该复合语句,并且它会一直执行到最后(除非另一个跳转语句干预,当然)。换句话说,case标签switch的标签工作方式与goto标签相同。在这方面,default标签与case标签没有任何区别。

这正是您在实验中观察到的结果。在switch声明如下所示

{ 
    printf("%s","Default"); 
    printf("%s","Case 0"); 
    printf("%s","Case 1"); 
    printf("%s","Case 2"); 
    return 0; 
} 

您通过您default:标签,在开始进入这一说法。由于您在进入您的switch(除了可能错位的最终return)身体之后没有改变控制流程,所有四个printf都会发生“火灾”变化。

以“但编译器知道它必须执行默认语句...”开头的问题的含义对我而言并不清楚。 C中构造的功能如上所述。这就是“编译器知道的”。另一方面,你似乎遵循了一些完全没有根据的自我发现的关于什么的错误概念,并且出于某种原因希望编译器遵循相同的误解。我想说,你需要阅读一本关于C语言基础知识的书,而不是试图猜测各种语言元素的作用。

首先制作default案例没有任何问题。考虑到我上面所说的,在某些情况下,声明中标签的排序问题。重要的时候,你必须根据你的意图安排他们。如果您需要将您的default箱子作为第一个箱子,请先做好。如果你不需要它(或者没有什么区别),你可以把它放在最后或者你想放置的地方。

2

但是一旦编译器知道它必须执行默认的语句,为什么我们需要把break语句默认case的语句之后?

因为这是语言的工作方式。该语言的标准规定执行应该从匹配的案例标签继续。您可能想知道为什么编译器不会自动添加break语句,在每个case之后。好吧,如果它没有,我们就无法做到这一点:

switch(x){ 
case 1: 
case 2: 
case 3: 
// do something 
break; 
case 4: 
// do something else 
break; 
default:; 
} 

如果编译器每种情况之后添加一个break,我们必须按如下方式重写上面的代码:

switch(x){ 
case 1: 
// do something 
case 2: 
// do the same thing 
case 3: 
// do the same thing 
case 4: 
// do something else 
default: 
} 
1

根据标准,程序员必须在每种情况下手动放置中断,即使它是默认情况。 如果程序员不是地方中断意味着它将执行所有情况下的情况。 标准在开关内将这种类型的开关编程称为FALL THROUGH条件。