让我们通过代码看问题:
码-1
#include <stdio.h>
int main(int argc, char *argv[])
{
int a =1;
switch (a)
{
printf("This will never print\n");
case 1:
printf(" 1");
break;
default:
break;
}
return 0;
}
此处printf()
语句永远不会执行 - 请参阅http://codepad.org/PA1quYX3。但是
code-2
#include <stdio.h>
int main(int argc, char *argv[])
{
int a = 1;
switch (a)
{
int b;
case 1:
b = 34;
printf("%d", b);
break;
default:
break;
}
return 0;
}
此处int b
将被声明 - 请参阅http://codepad.org/4E9Zuz1e。
我不明白为什么code1 printf()
没有执行但是在code2 int b
中会执行。
为什么呢?
修改 我得到了那个b;是声明,它是在编译时分配内存,所以控制流是否到达那个声明将完成。
现在看到这段代码
#include<stdio.h>
int main()
{
if(1)
{
int a;
}
a =1;
return 0;
}
这里int a在控制流路径中仍然没有编译...为什么?
答案 0 :(得分:7)
将switch
视为仅带有标签的goto
。你goto
的位置并不重要,只要变量声明高于你使用它的位置,就可以使用它。这部分是由于变量声明不是一个像表达式一样“完成”的可执行语句。那个开关非常接近于:
int a = 1;
{
if (a == 1) goto case1;
goto defaultcase;
int b;
case1:
b = 34;
printf("%d", b);
goto end;
defaultcase:
goto end;
end:
}
return 0;
而goto
与b
的范围无关。
尝试这样做:
switch (a)
{
int b = 1;
....
在这种情况下,即使声明了b
,也会跳过初始化,因为是可执行或不执行的可执行语句。如果您尝试这样做,编译器应该发出警告。
关于if
内的声明(已更新的问题):在这种情况下,a
的范围仅限于if
。它在输入范围时创建,并在范围结束时销毁。
答案 1 :(得分:2)
因为int b;
是一个声明,编译器不会为它生成代码。
int a = 1;
switch (a) {
/* Instructions corresponding to the code here will not be executed */
/* printf("hi"); Instructions for such code will never be executed */
/* int b; It is just a declaration. No executable code is generated for it*/
int b = 34;/*Replaced int b by int b = 34 now b will never be initialized to 34*/
case 1:
printf("%d",b); /*you will get garbage value now*/
break;
default:
break;
}