Почему следующее не дает ошибку?
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
для внутреннего цикла разве я не должен получать ошибку о повторных определениях?
Вы фактически создаете новую переменную с тем же именем, что и другая переменная. Поскольку они находятся в разных областях видимости, это разрешено, и переменная во внутренней области видимости "владеет" именем. Вы не сможете получить доступ к i
, находящейся во внешней области видимости, внутри внутренней области видимости.
Само объявление цикла for является частью области видимости цикла for, поэтому считается частью внутренней области видимости в случае второго i
.
Лучший способ понять это - подумать обо всем, что находится между (и), когда вы объявляете цикл for как находящийся внутри фигурных скобок этого цикла for, по крайней мере, в том, что касается области видимости.
Чтобы понять это, рассмотрим функцию, в которой не объявлена переменная x, тогда следующий код внутри выдаст вам ошибку. (Мы также предполагаем, что у вас нет другой переменной x, определенной глобально.)
for (int x = 0; x < 10; x++)
{
something();
}
x++; // error, x is not defined.
Компилятор 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
Это незаконно в большинстве диалектов Си; это законное объявление в Си++, и поэтому может быть принято, если вы компилируете Си компилятором Си++:
for( int i=0; i<5; ++i){}
В Си++ принято иметь итератор цикла только в области видимости цикла, но Си следит (специально для C90, а не C99), чтобы объявление было вне области видимости цикла. Надеюсь, это поможет... :-)
Итак, когда вы объявляете другой цикл FOR внутри старого, то область видимости начинается заново, и ваш код компилируется без ошибок в C++ или C99. Это обычная принятая норма для объявления области видимости.
Внутренний цикл запускает другой уровень области видимости, цикл for запускает область видимости в определении цикла, поэтому второй i находится в новой области.
см.
http://en.wikibooks.org/wiki/C%2B%2B_Programming/Scope#Scope_using_other_control_structures
ВЫ УВЕРЕНЫ, ЧТО ВЫ НЕ ПОЛУЧИЛИ ОШИБКУ ПРИ ВЫПОЛНЕНИИ ЭТОГО ....?
вы пытаетесь определить две переменные типа int в пределах одной границы. Из-за этого это вызовет ошибку. в C #, если вы попробуете тот же код, вы получите сообщение об ошибке
Ошибка 1 Локальная переменная с именем 'i' не может быть объявлена в этой области, потому что она придала бы другое значение 'i', которое уже используется в «родительской или текущей» области для обозначения чего-то еще