2012-02-23 7 views
14

ブロックのcaseラベル付きステートメントが処理される前のステートメントはどのように処理されますか?switch文はどのように機能しますか?

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    int i=0; 
    case 1:printf("%d",i);   
    } 
getchar(); 
return 0; 
} 

出力:ガベージ値 次のプログラムの動作に

PROG1を説明してください。

PROG2:

#include<stdio.h> 
int main() 
{ 
    switch(1) 
    { 
    printf("Inside Switch"); 
    case 1:printf("Case 1\n");  
    } 
    printf("Outside Switch"); 
    getchar(); 
    return 0; 
} 

出力:

ケース1

外切り替えます。

ケース2のラベルのステートメントの前のステートメントは到達不能に見えますが、最初のプログラムで宣言されていない変数i(エラーのみ)のエラーが表示されません。

switchステートメントが内部的にどのように扱われるかを誰かが詳しく説明できる場合は、本当に役に立ちます。

+1

この宿題はありますか?宿題のように聞こえる。もしそうなら、 '宿題'タグを付け加えてこれまでの自分の作品を見せてください。 –

+2

@ T.J.Crowderこれは宿題ではありません。私はGildでCクイズを取っている間にこれを見つけました。私は知りたいと思っています。 – Bazooka

+0

'switch'ステートメントは基本的に' goto'sを持つジャンプテーブルの構文的な砂糖です。 –

答えて

6

これは、c標準の引用によって最もよく説明されています。 私はここにあなたの質問に当てはまる基準から関連する部分を引用しています。

6.8.4.2 switch文

パラ4:

switch文原因によって、へ、又は switch体であるステートメントを過ぎ、にジャンプするように制御します制御式の値と defaultラベルとスイッチ本体上またはスイッチ本体内のcaseラベルの値のいずれかがある場合は

パラ2:

switchステートメントを可変修飾型の 識別子の範囲内の関連case又はdefaultラベルを持っている場合、スイッチ全体文は 以内でなければなりませんその識別子のスコープ154)

脚注:

154)、宣言がswitch文の前のいずれか、またはそれはswitchに関連付けられている最後のcaseまたはdefaultラベルをたどります宣言を含むブロック内の

パラ7:
人工プログラムフラグメントで 例

switch (expr) 
{ 
    int i = 4; 
    f(i); 
    case 0: 
     i = 17; 
     /* falls through into default code */ 
    default: 
     printf("%d\n", i); 
} 

その識別子でiは(ブロック内)自動ストレージ期間で存在するが、初期化されることはない、対象としたがって、制御式が0以外の値を持つ場合、printf関数の呼び出しは不確定な値にアクセスします。同様に、関数fの呼び出しはに到達できません。上述の問題のコード例の双方に適用



Example 1は、iコントロールが一致caseラベルにジャンプするので
Example 2で、printfコールに達していないものの、したがって、ごみを印刷し、それは&初期化されていませんでしたので、不定値を持っています。

+1

これと他の人に感謝してくれてありがとう。とても有難い。 – Bazooka

+0

+1。興味のある方は、コンパイラによってどのように実装されるかについての小さな記事もあります。[here](http://lazarenko.me/2013/01/13/switch-statement-machine-code/)を参照してください。 –

5

スイッチは、基本的に、適切なラベルに移動するように機能します。介在する文は実行されません。変数の定義(コンパイル時に実際に起こる)は起こりますが、それらに初期化が含まれていればそれもスキップされます。

+0

コード例を提供できますか? –

2

実行されないため、大文字と小文字のどちらでもないステートメントをスイッチに書き込まないでください。

注:宣言が書かれてではなく、文の(私はint型、宣言ですが、私は10 = int型;宣言+代入=ステートメントので、割り当てが実行されることはありません...です!)することができ

switch(a) 
{ 
printf("This will never print"); // this will never executed 
case 1: 
     printf(" 1"); 
break; 

default : 
break; 
} 

こちらをご覧くださいWhy variables can not be declared in a switch statement just after labels?

+1

リンクと回答ありがとう。 – Bazooka

関連する問題