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;

```