2017-01-22 5 views
0

Так что, если я инициализировать переменную того же типа и имени в основной функции компилятор будет жаловаться декларации повторно, например:Почему компилятор C++ 11 не жалуется, когда я инициализирую локальную переменную с тем же именем несколько раз в пределах одной и той же области?

for (int i = 0; i < 5; i++) 
{ 
    int a{5}; 
    int a{5}; // error int a previously declared here 
} 

Но нет никаких ошибок, если я компилирую вместо этого:

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

Насколько я понимаю, это похоже на то, что я инициализировал «int a» несколько раз в пределах той же области видимости, что, очевидно, вызовет ошибку. Если кто-то может объяснить, что происходит на самом деле, мы будем очень благодарны! Благодаря!

+2

Обратите внимание, что это не относится к компилятору g ++. Он является частью спецификации языка C++. – juanchopanza

+0

Вы спрашиваете, почему область тела цикла не засчитывается несколько раз? –

+1

Вы инициализируете 'a' каждый раз, когда цикл выполняется. –

ответ

4

Вы путаете масштабы и продолжительность жизни, это кажется.

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

В моем понимании, это выглядит, как если бы я инициализирован «Int А» несколько раз в пределах той же области, что, очевидно, вызовет ошибку.

Почему это, очевидно, вызывает ошибку? a всегда является той же переменной, на каждой итерации цикла. Но он всегда указывает на другой объект, срок службы которого начинается и заканчивается текущей итерацией.

Если такая вещь не будет работать, то вы не могли даже назвать ту же функцию, два раза:

void f() 
{ 
    int x = 0; 
} 

f(); 
f(); // why should this be an error? 

Обратите внимание, что этот вопрос выходит далеко за рамки г ++, и даже далеко за пределами C++. Каждый C-производный язык программирования работает именно так. По крайней мере, я никогда не видел того, кто этого не делает.

1

В моем понимании, это выглядит, как если бы я инициализирован «Int А» несколько раз в том же объеме

Вы правы по поводу «несколько раз» часть, но вы не правы " тот же объем ": область действия второго int a равна Вложенная внутри внешней области, в которой объявлен первый int a. Следовательно, вторая декларация является законной: она скрывает внешнюю декларацию, которую позволяет язык.

int a = 5; 
cout << a << endl; 
{ 
    int a = 6; 
    cout << a << endl; 
} 
cout << a << endl; 

Demo выше produces этот выход:

5 
6 
5 
+2

Я не вижу, где OP имел «int a» во внешнем пространстве. Я думаю, что OP спрашивает об итерациях нескольких циклов, каждый из которых объявляет переменную 'int a {5};', заявив, что все они определены в той же области (тело цикла). Вторая итерация цикла не вложена в первую. – hvd

+0

Нет, «новая инициализация только вложен глубже с каждой итерацией цикла» не является правильным объяснением. –

+0

@ н.м. В программном пространстве нет такой вещи, как «циклическая итерация» (это временное пространство, в котором повторяются итерации цикла). Loop - один из многих способов открыть вложенную область; вот и все. – dasblinkenlight

0

Я думаю, что ваш путаться с объявляя переменную и инициализировать ее

for (int i = 0; i < 5; i++) 
{ 
    int a{5}; // In this part you are declaring and initializing the variable 
    int a{5}; // error int a previously declared here 
    // same with this case as well 
} 

Если вы хотите сделать, что вы можете использовать этот

for (int i = 0; i < 5; i++) 
    { 
     int a{5}; 
     a=5; // error int a previously declared here 

    } 

в этой точке int a{5} Это будет Провозглашение переменная и инициализация переменной в области цикла петли

и a=5; и здесь повторно инициализировать этот конкретный ва в том же объеме