为什么这个程序不输出20?
#include<stdio.h>
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;
}
答案 0 :(得分:30)
因为switch语句会跳转到相关的大小写,所以永远不会执行第int b = 20
行。
答案 1 :(得分:8)
您的编译器应该警告您。 'b'的初始化位于switch语句的开头,它永远不会被执行 - 执行将始终直接从switch语句标题流到匹配的case标签。
答案 2 :(得分:2)
它不输出“b = 20”,因为在switch语句中设置了b,并且从不执行该指令。你想要的是这个:
int b = 20;
switch (a) {
case 1:
{
printf("b is %d\n", b);
break;
}
default:
{
printf("b is %d\n", b);
break;
}
}
答案 3 :(得分:2)
当你调用printf()
时,Gcc会发出警告,说b未初始化你必须在switch()
之前移动“int b = 20”答案 4 :(得分:2)
交换机内部是隐藏的goto
语句。所以基本上发生的事情真的是
int a=1;
if(a==1){ //case 1
goto case1;
}else{ //default
goto default;
}
int b=20;
case1:....
答案 5 :(得分:2)
请注意,case
语句中的switch
标签被称为“标签”,原因如下:它们几乎都是普通标签,就像您可以goto
那样。这实际上是switch
的工作原理:它只是goto
的结构化版本,只是从switch
跳转到相应的标签并从那里继续执行。在您的代码中,您总是跳过b
的初始化。因此,b
永远不会被初始化。
答案 6 :(得分:2)
代码
int b = 20
实际上做了两件事:
int b
和
b = 20
编译器在编译程序时设置一个名为b的变量。这是一个automatic
变量,它在堆栈中。但在程序执行到达该点之前,它不会为其赋值。
在此之前,不知道变量的值是什么。
对于全局变量或static
变量,这是不正确的 - 这些变量在程序开始运行时被初始化。
答案 7 :(得分:1)
使用gcc进行编译(在Windows上使用cygwin)会发出警告消息 -
警告:开头无法访问的代码 of switch statement
并且输出未定义或垃圾,清楚地表明b的初始化部分从未执行,因此未定义的值。
注意:如果代码或行无法访问,可以提出问题, 那我们为什么不得到错误: 'b'未宣布。
编译器检查语法 程序(上面检查是否声明了b)并发现它是正确的(b被声明), 虽然在语义/逻辑上是这样的 不正确。
未来编译器可能会变得更加智能,并且能够检测到这些错误
答案 8 :(得分:0)
该行
int b=20;
在进入开关之前未执行。你必须将它移到switch语句之上以获得20输出。