C - Tricky Switch Case工作..!
民歌,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语句?
该switch语句将跳转到相应的case
或default
,然后代码将继续,直到下一个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;
它与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;
但是,一旦编译器知道它必须执行默认语句,为什么我们需要在默认情况下的语句之后放置一个break语句? – 2011-04-25 07:38:57
@herbalessence查看开关案例,并在那里解释。 http://visualcplus.blogspot.com/2006/03/lesson-12-switch-case-break-and.html – zengr 2011-04-25 07:41:03
另请参阅[this](http://www.cprogramming.com/tutorial/c/lesson5。html) – 2011-04-25 07:43:01
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
箱子作为第一个箱子,请先做好。如果你不需要它(或者没有什么区别),你可以把它放在最后或者你想放置的地方。
但是一旦编译器知道它必须执行默认的语句,为什么我们需要把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:
}
根据标准,程序员必须在每种情况下手动放置中断,即使它是默认情况。 如果程序员不是地方中断意味着它将执行所有情况下的情况。 标准在开关内将这种类型的开关编程称为FALL THROUGH条件。
你的休息地点在哪里?声明? – 2011-04-25 07:33:47
它是否预计每个病例会中断? – 2011-04-25 07:34:54
它不会但它会执行匹配的所有情况,直到它移出或发现中断 – 2011-04-25 07:40:45