如何处理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
语句,那将会非常有用。
答案 0 :(得分:7)
最好通过c标准的引用来解释。 我引用了适用于您的问题的标准中的相关部分。
6.8.4.2开关语句
第4段:
switch
语句会导致控件跳转到,进入或超过语句switch
正文,取决于控制表达式的值,以及a的存在default
标签以及交换机主体上或内部的任何case
标签的值......
第2段:
如果
switch
语句在范围内有关联的case
或default
标签 具有可变修改类型的标识符,整个switch语句应在 该标识符的范围。 154)
FootNote:
154)也就是说,声明要么在switch语句之前,要么跟在与
case
关联的最后default
或switch
标签之后。在包含声明的块中。
第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
。
上述内容适用于问题中的两个代码示例
f
,Example 1
有一个 Indeterminate 值,因为它从未初始化&amp;因此打印垃圾,而在
未达到i
,Example 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?