switch语句如何工作?

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

PROG1:

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

输出:垃圾值。

PROG2:

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

输出:

情况1

外部交换机。

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

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

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

6.8.4.2 switch语句

第4段:

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

第2段:

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

脚注:

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

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

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

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


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

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

切勿在开关中写入不属于任何情况或默认值的语句,因为它们不会被执行。

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

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

请看这个为什么变量不能在标签之后的switch语句中声明?