2010-12-01 11 views
-2
void display() 
{ 
    printf("every thing is ok"); 
} 
void main() 
{ 
    int ch; 
    while(1) 
    { 
     printf("enter your choice"); 
     scanf("%d",&ch); 
     switch(ch) 

     { 
      case 1: clrscr();printf("when choice is one every thing is fine"); 
        display(); 
        break; 
      case 2: clrscr();printf("when chice is two its confusing"); 
        display(); 
        break; 
      case 3: exit(0); 
      default: printf("enter choice as 1 or 2 or to exit enter 3"); 
     } 
    } 
} 

このCプログラムをトレースして、選択肢2を入力すると、ケース1ブロックからの表示機能が呼び出されます。ぜんぜんわかりません。説明文で返信してください。私は本当に混乱しています。c switch文

+0

私によく見えます。 1を入力するとどうなりますか? 「それはcase 1ブロックからdisplau関数を呼び出します」という意味はどうですか?あなたが提供したコードのcase 1とcase 2の両方からDisplay()が呼び出されます –

+1

あなたの期待される出力は何ですか?あなたは何を見ていますか? – casablanca

+0

* exact *出力を表示してください。私はそれが何か興味深いものを明らかにすると信じている。 – abelenky

答えて

4

コンパイラはおそらく、ソース文をbasic blocksに畳んで並べ替えています。デバッガは、両方の場合に同じソース行番号にdisplay()の呼び出しを一致させます。これは通常、最適化が有効になっているときです。

+0

いいえ、 'scanf'行は例えば次のように変換します。 「1」から「1」までの数字である。 – aschepler

+0

それははるかに理にかなっています。 – meagar

0

あなたのコンパイラは、2つの異なるケースで同じ関数呼び出しを見たときに、最適化して何か面白くしているかもしれません。コンパイラのフラグをチェックし、異なる引数をdisplay()に追加して、実際にあなたが指定したときに呼び出されるかどうかを確認してください。

0

コンパイラは、コードをより効率的に変換します。これはデバッグしようとすると混乱する可能性があるので、おそらく最適化をオフにする必要があります(これはコンパイラやIDEによって異なります)。

あなたはprintfcase 1case 2が同一である後、あなたはそれだけで1コールdisplayに持つことが、より効率的であり得ることを認識すべきであることを、あなたのコードに気付いた場合 - 例1は、ちょうど最後にジャンプします他のケースの声明とプログラムの結果は同じです。

あなたはそれ以上のことができます。 case 1case 2の唯一の実際の違いは印刷される文字列であるため、印刷される文字列へのポインタを設定する少しのコードを除いて、コードブロック全体のコピーを1つだけ持つことができます。