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内部如何处理该陈述,那将会非常有用.
这可以通过c标准的引用来解释.我引用了适用于您的问题的标准中的相关部分.
6.8.4.2 switch语句
第4段:
一个
switch语句使控制跳转到,进入或超过作为switch正文的语句 ,具体取决于控制表达式的值,以及default标签的存在 以及case交换机体上或中的任何标签的值...... ...
第2段:
如果
switch语句在具有可变修改类型的标识符范围内具有关联case或default标签,则整个switch语句应在该标识符的范围内.154)
脚注:
154)也就是说,声明要么在switch语句之前,要么在跟随包含声明的块中的last
case或defaultlabel之后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标签,因此未达到调用.