Jee*_*tel 2 c switch-statement
让我们通过代码看问题:
代码-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;
}
Run Code Online (Sandbox Code Playgroud)
这里的printf()语句永远不会执行 - 请参阅http://codepad.org/PA1quYX3.但
代码-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;
}
Run Code Online (Sandbox Code Playgroud)
这int b将被宣布 - 请参阅http://codepad.org/4E9Zuz1e.
我没有得到为什么在code1 printf()中不执行但在code2中将int b执行.
为什么?
编辑: 我得到了int b; 是声明,它是在编译时分配内存,所以控制流是否到达那个声明将完成.
现在看看这段代码
#include<stdio.h>
int main()
{
if(1)
{
int a;
}
a =1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里的int是在控制流路径中仍然没有编译...为什么?
想象一下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;
Run Code Online (Sandbox Code Playgroud)
这与gotos的范围无关b.
尝试这样做:
switch (a)
{
int b = 1;
....
Run Code Online (Sandbox Code Playgroud)
在这种情况下,即使b声明了,也会跳过初始化,因为这是一个可执行或不执行的可执行语句.如果您尝试这样做,编译器应该发出警告.
关于内部声明if(更新的问题): 在这种情况下,a范围仅限于if.它在输入范围时创建,并在范围结束时销毁.