7

可能重复:
为什么不能在 switch 语句中声明变量?
绕过定义时如何使用变量?

#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。这是怎么回事?

4

5 回答 5

8

在 switch 语句中初始化变量是不好的做法和未定义的行为。

于 2012-06-19T12:53:40.870 回答
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会发现您正在使用未初始化的值。

于 2012-06-19T12:55:41.053 回答
5

如果你打开你的编译器警告,你会看到:

warning: ‘b’ may be used uninitialized in this function

这不是 initialise 的有效位置b,因此它在打印时包含未初始化的数据而不是 20。您正在导致未定义的行为。

于 2012-06-19T12:54:07.793 回答
0

该语句根据变量的值对相应的switch语句执行一个操作,仅此而已。现在您正在绕过 的初始化,因此它将打印出当时在该位置的内存中的任何内容。gotocaseswitchb

于 2012-06-19T12:56:00.773 回答
-2

它是一个 var范围问题。如果你搬家

int b=20;

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

于 2012-06-19T12:54:52.440 回答