可能重复:
Why can't variables be declared in a switch statement?
How can a variable be used when its definition is bypassed?
#include<stdio.h>
int main()
{
int a=1;
switch(a)
{ int b=20;
case 1: printf("b is %d\n",b);
break;
default:printf("%d\n",b);
break;
}
return 0;
}
在gcc 4.6.3上运行,输出不是20.这里发生了什么?
答案 0 :(得分:8)
在switch语句中初始化变量是不好的做法和未定义的行为。
答案 1 :(得分:6)
switch语句具有以下结构:
switch ( expression ){
// declarations
case constant-expression :
...
case constant-expression :
...
default :
...
}
声明部分在编译时用于声明变量,但在运行时不用于初始化它们(实际上没有执行该部分中的语句)。声明和初始化变量之间没有区别。由于b
永远不会初始化,因此您的代码与以下内容具有相同的结果:
int main(){
int b;
printf("b is %d\n", b);
return 0;
}
这显然是未定义的。使用-Wall
标志进行编译将会发现您使用的是未初始化的值。
答案 2 :(得分:5)
如果你打开编译器警告,你会看到:
warning: ‘b’ may be used uninitialized in this function
这不是初始化b
的有效位置,因此它在打印时包含未初始化的数据而不是20.您正在导致未定义的行为。
答案 3 :(得分:0)
switch
语句根据goto
变量的值对相应的case
语句执行switch
,仅此而已。现在你绕过了b
的初始化,所以它会打印出那个位置当时内存中的内容。
答案 4 :(得分:-2)
它是一个var 范围问题。如果你移动
int b=20;
在开关块之外,它将起作用。