3

私によると、whileループは無限であるはずですが、実行されるのは3回だけです。

   main()
   {
   int i=3;       
   while(i--)
    {
      int i=100;
      i--;
      printf("%d..",i);
    }
   }

出力します99..99..99

しかし、私によれば、制御がwhileループに入るたびに、値100を取得するため、無限に実行されるはずです。したがって、ゼロに達することはありません。実験するために、whileループの内側に置き換えましint i=100;たが 、今では無限に実行されます。i=100;

4

5 に答える 5

7

の変数は、ループ内で定義された変数iwhile(i--)は異なります。i

基本的に、新しい変数を参照しているブロックの前と内側をint i = 100 シャドウします。int i = 3while

結局のところ、私はあなたがこのようなことをする必要があるというもっともらしいシナリオを見つけません。

于 2011-11-06T12:51:28.357 に答える
7

i条件をチェックする変数はmain()、ループ内の変数ではなく、宣言した変数です。

どちらも異なる変数であるため、1つとして混乱させることがあります。コンパイラーは、以前ほど簡単に混乱することはありません。

ループのi内側はあなたが内側で宣言したものを指します{ }が、外側はで{ }宣言iされたものを指しますmain()

于 2011-11-06T12:52:57.437 に答える
5
while(i--)
    {
      int i=100; // gets created every time the loop is entered
      i--;
      printf("%d..",i);
    } // the i in the loop keeps getting destroyed here

なぜあなたも試してはいけないのですか?

while(i--)
{

              {
                  int i=100; //Visible only in this scope
                  i--;
                  printf("inner i=%d..",i);
              } //gets destroyed here
        printf("\nouter i=%d..\n",i);
}
于 2011-11-06T12:56:21.370 に答える
2

すべての変数は、最新の宣言を参照します(もちろん、そのスコープで有効です)。

main()
{
   int i=3;       
   while(i--)             // this i is the one defined in the line above
   {
       int i=100;
       i--;               // this i is the one defined in the line above
       printf("%d..",i);  // this i is the one defined two lines above
   }
}

iつまり、whileループは、によって宣言されたものに依存するため、3回繰り返されます。これは、ループ内で、 edによって宣言されたものを参照しているためにint i = 3;出力されます。99iiint i = 100;--

に変更int i = 100;するi = 100と、最初の変数が変更され、i別の変数は導入されません。したがって、無限ループ。

編集一部の人々は、「最新」の代わりに、この例を挙げて「現在のスコープでアクセス可能な最も内側の宣言」と言うべきだと言いました。

int a=4;
{
    int a=10;
}
printf("%d", a);

2番目aはによって表示されないためprintf、明らかprintf("%d", a);にそれを参照することはできません。読者は、変数が定義されているスコープ内でのみ変数にアクセスできることを十分に知っていると思います。そうでない場合、最初の2つのコメントのフレーズはより正確です。

于 2011-11-06T12:53:15.643 に答える
1

C ++のすべてのスコープ(大まかに言えば、配列の初期化などの特別な目的に使用されない中括弧の各ペア)には、独自のローカル変数宣言が含まれている場合があります。ループ内に書き込むと、ループ外の変数とは異なるint i = 100;名前の別の変数が指定され、スコープ内のコードがデフォルトで外部ではなく内部を参照するようになります。ただし、intheloop条件は引き続きouterを使用します。iiii--i

に置き換えるint i = 100i = 100、変数は1つだけになり、100に設定され、2回デクリメントされ(ループ内で1回、ループ自体で1回)、100に再設定されます。

于 2011-11-06T12:54:30.193 に答える