变量在switch语句中声明和初始化

时间:2009-11-05 20:37:20

标签: c variables switch-statement

为什么这个程序不输出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;
}

9 个答案:

答案 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输出。