Я знаю, что локальные переменные в 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 ++?
Конкретные реализации свободны не устанавливать их («локальные» переменные) на что-либо или устанавливать для них любое значение, которое они хотят, включая ноль. Стандарт не обязывает их устанавливать ненулевое значение, в конце концов 🙂
Стандарт просто утверждает, что их значение, если оно не установлено явно, не определено. Следовательно, это не то, на что положился бы хороший программист. Это покрыто 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
все используют так же компилятор под одеялом, так что вряд ли это будет исчерпывающим тестом в этом случае.
Нет, это не правда. Инициализация переменных до нуля повлечет за собой ненужные затраты производительности. Нестатические переменные не инициализируются нулем.
Поведение использования неинициализированной переменной в C ++ не определено.
Вы можете обнаружить, что конфигурация отладки инициализирует переменные нулем. Я считаю это особенно пагубным и всегда гарантирую, что любые опции компилятора, которые делают это, отключены.
Последние версии Windows (и, возможно, и другие ОС) инициализируют всю неинициализированную память в 0 при запуске программы.
Поэтому все «неинициализированные» переменные будут отображаться как 0.
Однако это зависит от ОС, а не от компилятора. При запуске такой программы под Windows 9x (у которой не было этой функции) переменные имеют случайные значения.
Переменные в стеке будут содержать случайные значения, как только стек будет использован:
void test()
{
int a;
std::cout << a;
}
int main()
{
someLargeFunction();
test();
}
Значение переменной «a» теперь зависит от функции «someLargeFunction»!