2012-06-19 7 views

答えて

8

switch文内の変数の初期化は、悪い習慣であり、未定義の動作です。代わりに20の

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

bを初期化するための有効なスポットではありませんので、それは印刷時に初期化されていないデータが含まれているあなたがいる:

+0

しかし、変数bは20と宣言されています。コンパイラは、変数bがどのくらいのスペースをとり、そこに格納するかを知っています。なぜその動作は未定義ですか? – Anon

+0

@Anon:ラベルの一部ではありません。 –

+0

、ありがとう、それを得た。 – Anon

5

あなたのコンパイラの警告を有効にした場合、あなたが表示されます未定義の動作が発生します。

-2

そのa var の問題です。移動すると

int b=20; 

スイッチブロックの外側に移動します。

6

switch文は、この構造を有する:

switch (expression){ 

    // declarations 

    case constant-expression : 
     ... 
    case constant-expression : 
     ... 
    default : 
     ... 
} 

宣言セクションは、変数を宣言するためにコンパイル時に使用されるが、実際には、そのセクションには文が実行されていないそれらを(初期化するために、実行時に使用されていません)。変数の宣言と初期化の違いはありません。明確に定義されていません

int main(){ 
    int b; 
    printf("b is %d\n", b); 

    return 0; 
} 

bので、あなたのコードは同じ結果を持っていintializedされることはありません。 -Wallフラグでコンパイルすると、初期化されていない値が使用されていることがわかります。

0

switch文はswitch変数と何よりもの値に基づいて、対応するcaseステートメントにgotoを行います。今はbの初期化をバイパスしているので、その時点のメモリにあったものはすべて表示されます。

関連する問題