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
相关的最后case
或default
标签之后。
第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 1
, i
有一个不确定的价值,因为它从来没有初始化,因此打印垃圾,而在
Example 2
, printf
调用未达到,因为控件跳转到匹配的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