Почему делает использование того же, включают имя переменной, вложенное ДЛЯ работы циклов?

Почему следующее не дает ошибку?

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 для внутреннего цикла разве я не должен получать ошибку о повторных определениях?

12
задан M Perry 6 March 2010 в 17:44
поделиться

5 ответов

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

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

15
ответ дан 2 December 2019 в 18:18
поделиться

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

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

for (int x = 0; x < 10; x++)
{
    something();
}
x++; // error, x is not defined.
2
ответ дан 2 December 2019 в 18:18
поделиться

Компилятор 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. Это обычная принятая норма для объявления области видимости.

2
ответ дан 2 December 2019 в 18:18
поделиться

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

см.

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

1
ответ дан 2 December 2019 в 18:18
поделиться

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

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

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

0
ответ дан 2 December 2019 в 18:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: