任何人都可以解释这个C程序的输出吗?

时间:2012-06-19 12:51:21

标签: c switch-statement

  

可能重复:
  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.这里发生了什么?

5 个答案:

答案 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;

在开关块之外,它将起作用。