2
#include<stdio.h>
int main() 
{
    int i=9;
    switch(i)
    {
         static int i=1;
         i=3;
         i=i*i;

         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }
    printf("%d",i);
}

実際の動作がわかりません。出力は45 9です。
正当な理由を教えてください。

  1. 使い方?
  2. なぜですか?

前もって感謝します。

4

3 に答える 3

4

case:次を除いて、switch 内で実行される前のステートメントはありません。variable declaration

#include<stdio.h>
int main() 
{
    int i=9;
    switch(i)
    {
         static int i=1;
         printf("I AM HERE %d\n", i);
         i=3;
         i=i*i;

         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }
    printf("%d",i);
}

出力は文字列を出力しませんI AM HERE

このスイッチは、次のように書くのと似ています

    switch(i)
    {
         static int i=1;
         case 3:
                 i=i+11;
         case 4:
                 i=i+22;
         case 5:
                 i=i+33;
         default:
                 i=i+44;
          printf("%d",i);
    }

の値なのでi = 9defaultケースが実行され、出力されますi = 45

また、switch 内で宣言された変数のスコープは、ブロックi内のみに制限されます。switch {}したがって、コントロールがこのスコープから出ると、その値はi = 9のブロックで宣言されますmain

于 2014-12-12T05:30:48.543 に答える
1

2 つiの s があります... 1 つはswitch()ボディを構成するブロック内でのみ表示され、もう 1 つはその外側で表示されます。switch(i)外側のスイッチi(9に初期化されたもの)なので、default:ケースに入ります。次に、次のコードを実行しますdefault:

     default:
             i=i+44;
      printf("%d",i);

...ブロックi内で宣言されたもの(に初期化されたもの)を使用しているため、「45」が出力されます。ただし、これはスイッチの外側には影響しません。switch()1i

switch()ブロックの右中括弧の後の 2 番目のprintf():

   }
   printf("%d",i);

スイッチの外側の from を使用するためi(9 に初期化されたもの)、"9" が出力されます。

基本的に、switch()本体はブロックであり、ブロックで宣言された変数はそのブロックに対してローカルですが、同じ名前の別の変数を外部スコープから隠すことができます。

于 2014-12-12T05:34:06.113 に答える
0

switch ステートメントは次のように機能します。

  1. switch ステートメントは、括弧内の式 (この場合はiの値) を評価し、適切な式(この場合は存在しないので9) にジャンプします。casedefaultcase 9
  2. 最初の変数より前の変数caseが宣言されます。この場合、という名前の新しい変数iが値で宣言されます1これは以前に宣言された と名前を共有していますがi、それらは別の変数であり、新しい変数は switch ステートメントの最後まで前の変数を「オーバーライド」することに注意してください。ラベルに直接ジャンプするため、defaultこのラベルの前のコードは実行されません。
  3. コードbreakは、switch ステートメントまたはその末尾に到達するまで実行されます。次に、switch ステートメント内で宣言されたすべての変数が消え、この場合、古いi変数に再びアクセスできるようになります。

ラベルで、プログラムはdefault「新しい」i変数 (以前は1) に 44 を追加し、それに 44 を追加して、新しい値 45 を与えます。次に、値を出力します。

ただし、switch ステートメントの後、新しいi変数はアンロードされ、古いi変数に再びアクセスできるようになります。の古い値がまだ残っている9ため、その値が出力されます。

于 2014-12-12T05:35:27.607 に答える