C - Tricky Switch Case工作..!

时间:2011-04-25 07:32:53

标签: c switch-statement case-statement

伙计,

最近开始学习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语句?

5 个答案:

答案 0 :(得分:7)

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 :(得分:2)

  

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

因为这就是语言的运作方式。语言的标准规定执行应该从匹配的case-label继续。您可能想知道为什么编译器在每个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:
}

答案 2 :(得分: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;

答案 3 :(得分:1)

C语言中switch语句的主体是一个连续的复合语句,带有几个入口点。每个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语言中switch/case构造的功能如上所述。这就是“编译器所知道的”。另一方面,你似乎遵循一些完全毫无根据的自我发明的误解,关于switch/case做什么,并且出于某种原因期望编译器遵循相同的误解。我要说你需要阅读一本关于C语言基础知识的书,而不是试图猜测各种语言元素的作用。

首先制作default案例并没有错。考虑到我上面所说的,在某些情况下,语句中的标签顺序很重要。重要的是,你必须按照你的意图安排它们。如果您需要将default案例作为第一个案例,请先将其设为首位。如果你不需要它(或它没有任何区别)你可以把它放在最后或你想要放在其他任何地方。

答案 4 :(得分:1)

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