码:
int main()
{
int a=1;
switch(a)
{
int b=20;
case 1:
printf("b is %d\n",b);
break;
default:
printf("b is %d\n",b);
break;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:当b的声明发生在这里时,它为b打印一些垃圾值为什么b在这里没有用20初始化?
因为将为int b应用程序运行分配内存,所以b = 20永远不会评估" ".
这是因为你的switch-statement将跳转到case 1:1或default:跳过有问题的语句 - 因此b将被取消初始化并调用未定义的行为.
以下两个问题(以及他们接受的答案)将进一步帮助您寻找答案:
将编译器警告/错误更高级别转换为希望在尝试编译源代码时为您提供此信息.
以下是gcc关于此事的说法;
foo.cpp:6:10: error: jump to case label [-fpermissive]
foo.cpp:5:9: error: crosses initialization of 'int b'
Run Code Online (Sandbox Code Playgroud)
1因为int a总是1(一)它总会跳到这里.
2最相关出来的两个环节,由我回答了.