C ++ для переменной области

Я новичок в c ++ и наткнулся на это:

```
    for (int i=0 ; i<500 ; i++) {
        //to do
    }

    int i;
    std::cin >> i;

```

UPDATE: Using visual studio 2010 (and the compiler it uses) the i outside the for loop has the value 500 AFTER the call to cin >> i; I am looking at the values using the Visual Studio debugger << (this is the problem - благодаря Greg)

Теперь я ожидал

а) int i; вне цикла for и int i = 0; быть разными переменными, то есть цикл for i выйти из области действия после закрытия фигурных скобок

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

Я думаю, что б) является преднамеренным (хотя мне трудно найти страницу в книге Бьярна Страуструпа на c ++), но я уверен, что в той же книге указано, что переменные имеют область охвата фигур, в которые они заключены.

В большинстве других языков, которые я знаю при объявлении переменных в конструкции for, они считаются находящимися в фигурных скобках цикла for, но в c ++ это, похоже, не так.

Является ли это так и является специфическим для цикла for или есть какие-либо другие случаи, когда это происходит (я не могу думать ни о каком другом, но эй, я новичок)

благодаря

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

I often use the principle *When in doubt, print more out*. If you use `std::cout << i`, then you should see the *actual* value of `i` that is in scope at the point where you print the output.



Hm, много ответов и даже один выбран как «решение».

Но в любом случае проблема с Visual C ++ 10.0 (компилятор, поставляемый с Visual Studio 2010) заключается в том, что  ~~по умолчанию он~~  он может быть настроен на предстандартное поведение, где область действия переменной, объявленной в < code> для цикла расширил блок, в который был помещен цикл.

Вы хотите эту опцию:

```
/Zc:forScope,wchar_t

```

который позволяет использовать стандартный код C ++  `для`  -scope, а также встроенный  `wchar_t`  тип, и вы хотите:

```
/GR

```

который позволяет RTTI (т. е.  `dynamic_cast`  и  `typeid` )).

Чтобы получить стандартную версию, вы также можете использовать этот вариант компоновщика:

```
/entry:mainCRTStartup

```

для включения стандартного  `C ++  `main`  для программ подсистемы GUI и, конечно же, вы хотите включить обработку исключений, но, как я помню, для проекта Visual C ++, который включен по умолчанию (хотя и не для компилятора командной строки) ,`

`Кроме того, конечно, вы хотите включить как можно больше предупреждений с помощью `/W4` , хотя это не имеет ничего общего со стандартным соответствием.

Но, в любом случае, суммирование, причина, по которой вы получаете странные  `для`  областей, скорее всего, связана с тем, что проект компилятора и/или Visual Studio  ~~defaulting~~  был установлен на старые предстандартные правила , а опция для этого - `/Zc: forScope` .`

Предполагая соответствие (и компилятор, не соответствующий этому вопросу, скорее всего, дал ошибку компиляции), ваши два  `i`  отличаются. Но ничто не мешает компилятору использовать одинаковое расположение памяти для обоих, так как их живое время также отличается, и, следовательно, второй  `i` , начиная с окончательного значения первого, поскольку он не инициализирован, равен следует ожидать в этом случае.

The fact that `cin >> i` doesn't allow you to enter a new value is unrelated with that. And you don't give enough information to do more than guessing a reason (my guess would be the stream is in an error state).



Я предполагаю, что это происходит, потому что 2nd i не является инициализированным, а компилятор использует тот же блок памяти для второго i.
Они все еще отличаются двумя переменными. И да, первый я зачерпнул до петли.
Поэтому он не определен, вы не можете рассчитывать, что второй i будет 500.

```
for (int i=0 ; i<500 ; i++) {
    //to do
}

int i=0; // initialize i
std::cin >> i;

```