объявление переменной в цикле while C / C ++ - PullRequest
3 голосов
/ 06 ноября 2011

, по моему мнению, цикл while должен быть бесконечным, но он выполняется только трижды

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

, он выводит 99..99..99

, но, по моему мнению, он должен работать бесконечно много раз, как при каждом контролевходит в цикл while, он получает значение 100. поэтому он никогда не достигнет нуля.просто чтобы поэкспериментировать, я заменил int i=100; на i=100; в стороне от цикла while, и теперь он работает бесконечное время .. ПОЧЕМУ ???

Ответы [ 5 ]

7 голосов
/ 06 ноября 2011

Переменная i, которая проверяет условие, является той, которую вы объявили в main(), а не внутри цикла.

Обе переменные разные, вы их путаете как одну, компилятор не так легко запутывается, как вы.

Внутри цикла i относится к тому, который вы объявили внутри { }, но вне { } i относится к тому, который объявлен в main()

7 голосов
/ 06 ноября 2011

Переменная i в while(i--) отличается от переменной i, определенной внутри цикла.

В основном int i = 100 тени предыдущие int i = 3 и внутри блока while вы ссылаетесь на новую переменную .

В конце концов, я не нахожу правдоподобного сценария, когда вам нужно будет сделать что-то подобное.

5 голосов
/ 06 ноября 2011
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);
}
2 голосов
/ 06 ноября 2011

Каждая переменная ссылается на свое последнее объявление (которое, конечно, действует в этой области):

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
   }
}

Таким образом, ваш цикл while повторяется 3 раза, поскольку он зависит от i, объявленногоint i = 3; Внутри цикла он печатает 99, потому что там i относится к i, объявленному int i = 100;, то есть -- ed.

Если вы измените int i = 100; наi = 100, тогда вы меняете первый i и не вводите другую переменную.Отсюда и бесконечный цикл.

Редактировать Некоторые люди говорят вместо «самого последнего», я должен сказать «самое внутреннее объявление, доступное в текущей области видимости», приводя этот пример:

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

Так как вторая a не видна printf, очевидно, printf("%d", a); не может ссылаться на нее.Я предположил, что читатель знает достаточно, чтобы знать, что переменная доступна только внутри области, в которой она определена. В противном случае, да, фразы в первых двух комментариях более точны.

1 голос
/ 06 ноября 2011

Каждая область в C ++ (грубо говоря, каждая пара скобок, которая не используется для специальных целей, таких как инициализация массива), может содержать собственные объявления локальных переменных. Запись int i = 100; в цикле указывает на другую переменную с именем i, которая отличается от той, которая находится вне цикла, и приводит к тому, что код в области действия, которая по умолчанию использует i, ссылается на внутренний i вместо внешний. Однако i-- в условии цикла все еще использует внешний i.

Когда вы заменяете int i = 100 на i = 100, теперь есть только одна переменная, которая устанавливается в 100, уменьшается на два (один раз внутри цикла и один раз на сам цикл) и повторно устанавливается на 100, повторно .

...