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

それは初期化する有効な場所bではないため、印刷時に 20 ではなく初期化されていないデータが含まれています。未定義の動作を引き起こしています。

于 2012-06-19T12:54:07.793 に答える
0

switchステートメントは、変数の値に基づいてgoto、対応するステートメントに対して a を実行します。現在、の初期化をバイパスしているため、その時点でメモリにあったものはすべてその場所に出力されます。caseswitchb

于 2012-06-19T12:56:00.773 に答える
-2

そのvarスコープの問題。動けば

int b=20;

スイッチブロックの外側では機能します。

于 2012-06-19T12:54:52.440 に答える