switch语句如何工作?

Baz*_*oka 16 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:垃圾值.

PROG2:

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

输出:

情况1

外部交换机.

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

如果有人能够详细解释switch内部如何处理该陈述,那将会非常有用.

Alo*_*ave 7

这可以通过c标准的引用来解释.我引用了适用于您的问题的标准中的相关部分.

6.8.4.2 switch语句

第4段:

一个switch语句使控制跳转到,进入或超过作为switch正文的语句 ,具体取决于控制表达式的值,以及default标签的存在 以及case交换机体上或中的任何标签的值...... ...

第2段:

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

脚注:

154)也就是说,声明要么在switch语句之前,要么在跟随包含声明的块中的last casedefaultlabel之后switch.

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

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

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


上述内容适用于问题中的两个代码示例.
Example 1,i具有Indeterminate值,因为它从未初始化并因此打印垃圾,而在
Example 2,printf由于控件跳转到匹配case标签,因此未达到调用.


Jer*_*fin 5

基本上,开关的作用类似于适当的标签 - 不执行干预语句.变量定义(实际上在编译时发生)确实发生了,但是如果它们包含初始化,那么它也会被跳过.