switch语句如何工作?

时间:2012-02-23 07:45:59

标签: c switch-statement

如何处理case块中任何switch-case标记语句之前的语句。 请解释以下程序的行为

PROG1:

#include<stdio.h>
int main()
{
  switch(1)
  {   
    int i=0; 
    case 1:printf("%d",i);         
  }
getchar();
return 0;
}

输出:垃圾值。

PROG2:

#include<stdio.h>
int main()
{
  switch(1)
  {  
    printf("Inside Switch");  
    case 1:printf("Case 1\n");      
  }
  printf("Outside Switch");
  getchar();
  return 0;
}

输出:

案例1

外部开关。

根据程序2,案例标记语句之前的语句似乎无法访问,但为什么我在第一个程序中没有为未声明的变量i收到错误(仅警告)。

如果有人可以详细解释如何在内部处理switch语句,那将会非常有用。

3 个答案:

答案 0 :(得分:7)

最好通过c标准的引用来解释。 我引用了适用于您的问题的标准中的相关部分。

6.8.4.2开关语句

第4段:

  

switch语句会导致控件跳转到,进入或超过语句   switch正文,取决于控制表达式的值,以及a的存在   default标签以及交换机主体上或内部的任何case标签的值......

第2段:

  

如果switch语句在范围内有关联的casedefault标签   具有可变修改类型的标识符,整个switch语句应在   该标识符的范围。 154)

FootNote:

  

154)也就是说,声明要么在switch语句之前,要么跟在与case关联的最后defaultswitch标签之后。在包含声明的块中。

第7段:
示例在人工程序片段中

switch (expr)
{
    int i = 4;
    f(i);
    case 0:
       i = 17;
       /* falls through into default code */
    default:
       printf("%d\n", i);
}
  

标识符为i的对象存在自动存储持续时间(在块内)但从未初始化,因此如果控制表达式具有非零值,则调用{{1}函数将访问一个不确定的值。同样,无法访问函数printf


上述内容适用于问题中的两个代码示例 fExample 1有一个 Indeterminate 值,因为它从未初始化&amp;因此打印垃圾,而在 未达到iExample 2来电,因为该控件会跳转到匹配的printf标签。

答案 1 :(得分:5)

基本上,一个开关就像一个goto到相应的标签 - 不执行干预语句。变量定义(实际上在编译时发生)确实发生,但是如果它们包含初始化,那么也会跳过它。

答案 2 :(得分:2)

永远不要在交换机中写入不属于任何情况或默认情况的语句,因为它们不会被执行。

注意:声明可以写在那里但不是语句(int i;是声明但是int i = 10;是声明+赋值=声明所以赋值不会在那里执行..!)

switch(a)
{
printf("This will never print"); // this will never executed
case 1:
        printf(" 1");
break;

default :
break;
}

请参阅此Why variables can not be declared in a switch statement just after labels?