2017-07-06 4 views
-4
#include <stdio.h> 
int main(void) { 
    int a = 1; 
    switch(a) { 
     int i = 2; 
     case 1: printf("%d",i); 
       break; 
     default: printf("Hello\n"); 
    } 
} 

次のコードサンプルは36として出力しています。これはどのように可能ですか?私は、コンパイラがiを評価せずに、コントロールをケース1に直接転送することを理解しています。しかし、なぜ私は36として出力を得ていますか?switch文内で変数を初期化する

PS:私はGCCを使用しています。

+3

なぜこのタグはjavaの下にありますか? – Curious

+0

これはどのように役立つでしょうか? @GAURANGVYAS – Jarvis

+0

私は '0'を取得するので、(少なくともCでは)未定義の動作を引き起こしていると思われます。 –

答えて

4

C++では、変数のスコープにジャンプできないため、このコードは不正です。

Cのコードが未定義の動作である:スイッチブロック内int i;が存在し、しかしcase 1:にジャンプすることによって次の値2iに割り当てされていた部分を迂回しました。実際には、初期化されていない変数を印刷しようとしています。

+0

だから、出力 - 36はGarbage値ですか? –

+1

@KarthikBhat [未定義の動作](https://stackoverflow.com/a/4105123/1505939) –

関連する問題