Правда ли, что современные компиляторы C ++ автоматически инициализируют локальные переменные в 0?

Я знаю, что локальные переменные в C & C ++ не инициализируются автоматически & если им не задано начальное значение, они имеют значения мусора. Я также знаю, что глобальный & статические переменные по умолчанию инициализируются нулями. Использование неинициализированной переменной приводит к неопределенному поведению в C ++.

Но недавно я попробовал следующую простую C ++ программу на различных реализациях C ++ & все дает мне 0 в качестве вывода.

#include <iostream>
int main()
{
int u;
std::cout<<u<<'\n';
}

Выход:

CodeBlocks 13.12 IDE: 0

Orwell Dev C ++ 5.8.3: 0

Ideone.com: 0 (посетите это: http://ideone.com/zWrgwo)

Правда ли, что современные компиляторы автоматически инициализируют локальные переменные в 0? или такой тип программы все еще представляет неопределенное поведение? Гарантируется ли всегда видеть 0 как вывод на каждой современной реализации C ++?

1

Решение

Конкретные реализации свободны не устанавливать их («локальные» переменные) на что-либо или устанавливать для них любое значение, которое они хотят, включая ноль. Стандарт не обязывает их устанавливать ненулевое значение, в конце концов 🙂

Стандарт просто утверждает, что их значение, если оно не установлено явно, не определено. Следовательно, это не то, на что положился бы хороший программист. Это покрыто C++11 8.5 Initializers [dcl.init] /11 (мой акцент):

Если для объекта не указан инициализатор, объект инициализируется по умолчанию; если инициализация не выполняется, объект с автоматическим или динамический Срок хранения имеет неопределенное значение.

Итак, в ответ на ваш заключительный вопрос, is it guaranteed to see 0 as output on every modern implementation of C++ always?ответ нет, просто и ясно.

Кроме того, вы можете обнаружить, что три «отдельные» среды, которые вы тестировали, CodeBlocks, DevC++ а также ideoneвсе используют так же компилятор под одеялом, так что вряд ли это будет исчерпывающим тестом в этом случае.

3

Другие решения

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

Поведение использования неинициализированной переменной в C ++ не определено.

Вы можете обнаружить, что конфигурация отладки инициализирует переменные нулем. Я считаю это особенно пагубным и всегда гарантирую, что любые опции компилятора, которые делают это, отключены.

3

Последние версии Windows (и, возможно, и другие ОС) инициализируют всю неинициализированную память в 0 при запуске программы.

Поэтому все «неинициализированные» переменные будут отображаться как 0.

Однако это зависит от ОС, а не от компилятора. При запуске такой программы под Windows 9x (у которой не было этой функции) переменные имеют случайные значения.

Переменные в стеке будут содержать случайные значения, как только стек будет использован:

void test()
{
int a;
std::cout << a;
}

int main()
{
someLargeFunction();
test();
}

Значение переменной «a» теперь зависит от функции «someLargeFunction»!

0
По вопросам рекламы [email protected]