2015-05-10 2 views
5
for(int i = 0; i < 3; i++) 
{ 
    for(int j = 0; j < 3; j++) 
    { 
     int n; 
     n++; 
     printf("n : %d\n", n)' 
    } 
} 

Выходной код кода 1 2 3 4 5 6 7 8 9. Мне интересно, почему переменная n в цикле for не инициализируется, когда объявление переменной казнены.C++ для переменной времени цикла является странным

+0

Я не знаю, как работает C++, но, с опытом, который у меня был с C, возможно, он выделяется в одном блоке памяти? try int n = 0. –

ответ

12

Вы никогда не инициализируете n определенным значением. C++ не будет делать это по умолчанию, когда вы вызываете int n. Вместо этого он просто резервирует целочисленный блок памяти. Поэтому, когда вы вызываете n++, программа просто захватывает любое значение, находящееся в этой памяти, и увеличивая его. Поскольку вы делаете это в быстрой последовательности и не создаете новые переменные между ними, это, как правило, захватывает одну и ту же память снова и снова. Как отмечает @NicolasBuquet, оптимизация компилятора также может отвечать за согласованность, с которой подобранный блок памяти выбран.

Если вы должны были присвоить значение n (то есть int n = 1;), это поведение исчезнет, ​​потому что определенное количество будет записано в кусок памяти, назначенный n.

+2

И я думаю, что это связано также с оптимизатором: поскольку вы объявляете ту же самую переменную int на каждой итерации своего цикла, я пытаюсь ее оптимизировать и переставлять переменную за пределы цикла, а не создавать ее на каждый уровень. –

+0

Отличный пункт, @NicolasBuquet. Это кажется очень вероятным. – seaotternerd

+0

Он имеет такое же значение без этой оптимизации, потому что в каждой итерации в стеке ничего не объявляется, поэтому переменная получает ту же позицию в стеке каждый раз. – Henrik

1

В C++ переменная не инициализируется значением по умолчанию; вы должны указать один явно, если вы найдете необходимость сделать это.

Результат вашего кода действительно не определен; просто удача, что вы получаете цифры от 1 до 9 в последовательности. На другой машине или реализации C++ вы можете получить разные результаты.

+2

Многие переменные инициализируются значениями по умолчанию. Автоматические переменные, которые являются встроенными типами, не инициализируются автоматически. Члены классов, которые плохо написаны, не могут быть автоматически инициализированы. Однако вы правы, что 'n' в примере кода не инициализируется. –

+1

переменные со статической продолжительностью хранения инициализируются значением (то есть нулевой инициализацией для основных типов) – vsoftco

+0

lol, хорошо, ребята, вы меня туда. Я стою исправленным по обоим пунктам. – thesentiment

Смежные вопросы