Почему использование одного и того же имени переменной count во вложенных циклах FOR работает?

почему не дает ошибку?

for (int i=0; i<10; ++i) // outer loop
{
    for (int i=0; i<10;++i) // inner loop
    {
    //...do something
    }
//...do something else
}

Как я понимаю, переменные в фигурные скобки ({...}) находятся в области действия только в этих фигурных скобках. Но внутренняя петля находится внутри скобок внешней петли. Поэтому, как только я объявлю int i=0 для внутреннего цикла, не должен ли я получить ошибку о нескольких определениях?

5 ответов


вы фактически создаете новую переменную с тем же именем, что и другая переменная. Поскольку они находятся в разных областях, это разрешено, и переменная во внутренней области "владеет" именем. Вы не сможете получить доступ к внешней области i внутри внутренней области.

само объявление цикла for является частью области цикла for, поэтому считается частью внутренней области в случае второго i.


лучший способ понять это-подумать обо всем Между ( и), когда вы объявляете цикл for как находящийся внутри фигурных скобок этого цикла for, по крайней мере, как это относится к области.

чтобы понять это, рассмотрим функцию, в которой у вас нет объявленной переменной x, тогда следующий код внутри даст вам ошибку. (Мы также предполагаем, что у вас нет другой переменной x, определенной глобально.)

for (int x = 0; x < 10; x++)
{
    something();
}
x++; // error, x is not defined.

компилятор C++ принимает это как допустимое, так как область второго находится только в фигурных скобках {}. Если вы реализуете то же самое в C, вы увидите такую ошибку:

$ gcc test.c
test.c: In function ‘main’:
test.c:10: error: ‘for’ loop initial declaration used outside C99 mode
test.c:12: error: ‘for’ loop initial declaration used outside C99 mode

это незаконно в большинстве диалектов C; это законное объявление C++, и поэтому может быть принято, если вы компилируете C с компилятором c++:

for( int i=0; i<5; ++i){}

обычно итератор цикла имеется только в области цикла в C++, но C гарантирует (особенно с C90, а не C99), что объявление выходит за рамки цикла. Надеюсь, это поможет ... :-)

Итак, когда вы объявляете другой цикл FOR в более старом, область начинается заново, и ваш код компилируется без каких-либо ошибок в C++ или C99. Это обычная принятая норма для объявления области применения.


внутренний цикл запускает другой уровень области видимости, поскольку циклы запускают область в определении цикла, поэтому второй i находится в новой области.

посмотреть

http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope#Scope_using_other_control_structures


ВЫ УВЕРЕНЫ, ЧТО НЕ ПОЛУЧИТЕ ОШИБКУ ПРИ ВЫПОЛНЕНИИ ЭТОГО ....?

вы пытаетесь определить две переменные int в пределах одной границы .из-за этого это породит ошибку . в c# , если вы попробуете тот же код, вы получите ошибку

Ошибка 1 локальная переменная с именем "i" не может быть объявлена в этой области, потому что она даст другое значение "i", которое уже используется в "Родительском или текущем" область для обозначения чего-то еще