Ano*_*non 7 c switch-statement
#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;
}
Run Code Online (Sandbox Code Playgroud)
在gcc 4.6.3上运行,输出不是20.这里发生了什么?
switch语句具有以下结构:
switch ( expression ){
// declarations
case constant-expression :
...
case constant-expression :
...
default :
...
}
Run Code Online (Sandbox Code Playgroud)
声明部分在编译时用于声明变量,但在运行时不用于初始化它们(实际上没有执行该部分中的语句).声明和初始化变量之间没有区别.由于b从未初始化,因此您的代码具有与以下相同的结果:
int main(){
int b;
printf("b is %d\n", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这显然是未定义的.使用该-Wall标志进行编译将捕获您正在使用未初始化的值.
如果您打开编译器警告,您将看到:
warning: ‘b’ may be used uninitialized in this function
Run Code Online (Sandbox Code Playgroud)
这不是一个有效的初始化点b,因此它在打印时包含未初始化的数据而不是20.您正在导致未定义的行为.