switch语句如何工作?

如何处理switch-case块中的任何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 1n");      
  }
  printf("Outside Switch");
  getchar();
  return 0;
}

输出:

情况1

开关外。

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

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


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

6.8.4.2 switch语句

第4段:

switch语句会根据控制表达式的值以及交换机上或交换机上是否存在default标签和任何case标签的值,导致控制跳转到,进入或通过作为switch主体的语句身体......

第2段:

如果一个switch语句在一个标识符范围内具有相关的case或者default标签,并且这个标识符的类型是可变的,那么整个switch语句应该在该标识符的范围内。

脚注:

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

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

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

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


上面提到的问题适用于问题中的两个代码示例。
Example 1i有一个不确定的价值,因为它从来没有初始化,因此打印垃圾,而在
Example 2printf调用未达到,因为控件跳转到匹配的case标签。


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


切勿在交换机中编写不属于任何情况或缺省部分的语句,因为它们不会被执行。

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

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

default :
break;
}

请参阅此内容为什么变量不能在标签后面的switch语句中声明?

链接地址: http://www.djcxy.com/p/84309.html

上一篇: How does switch statement work?

下一篇: MFMailComposer sending attached image size increased