Каждая переменная ссылается на свое последнее объявление (которое, конечно, действует в этой области):
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);
не может ссылаться на нее.Я предположил, что читатель знает достаточно, чтобы знать, что переменная доступна только внутри области, в которой она определена. В противном случае, да, фразы в первых двух комментариях более точны.