Вопрос:
Почему определены неинициализированные объекты встроенного типа внутри тело функции имеет неопределенное значение, а объекты встроенного типа определены вне любой функции инициализируются в 0
или же ''
?
Возьмите этот пример:
#include <iostream>
using std::cout; using std::endl;
int ia[10]; /* ia has global scope */
int main()
{
int ia2[10]; /* ia2 has block scope */
for (const auto& i : ia)
cout << i << " "; /* Result: 0 0 0 0 0 0 0 0 0 0 */
cout << endl;
for (const auto& i : ia2)
cout << i << " "; /* Result: 1972896424 2686716 1972303058 8
1972310414 1972310370 1076588592 0 0 0 */
return 0;
}
Потому что одним из общих правил C ++ является то, что вы не платите за то, что не используете.
Инициализация глобальных объектов относительно дешева, потому что это происходит только один раз при запуске программы. Инициализация локальных переменных добавит накладные расходы к каждому вызову функции, что не всем понравится. Поэтому было решено сделать инициализацию локальных файлов необязательной, так же, как в языке Си.
Кстати, если вы хотите инициализировать ваш массив внутри функции, вы можете написать:
int ia2[10] = {0};
или в C ++ 11:
int ia2[10]{};
Переменные, определенные вне функции, находятся в глобальной области видимости. Глобальные переменные хранятся в части BSS сегмента данных исполняемого файла. По умолчанию они инициализируются нулями при запуске программы и выполняются только один раз.
Переменные, определенные в функции с другой стороны, хранятся в стеке, и каждый раз инициализация его нулем будет относительно дорогой операцией.
Посмотрите на эту ссылку для Memory Layout программы: Макет памяти 1
Посмотрите на эту ссылку также для хорошего объяснения:
Макет памяти 2
Цитирование по ссылке выше
Глобальные, внешние и статические переменные по умолчанию обнуляются.
Ну ответ на ваш вопрос можно найти здесь http://www.cplusplus.com/doc/tutorial/arrays/
По сути, если переменная определена вне области действия, она по умолчанию инициализируется нулем.
Статические массивы и те, которые объявлены непосредственно в пространстве имен (вне любого
функция), всегда инициализируются. Если нет явного инициализатора
указано, все элементы инициализируются по умолчанию (с нулями, для
основные типы).
Это сравнивается с переменными, определенными внутри области видимости, которые не определены 0.
По умолчанию обычные массивы локальной области видимости (например, объявленные
внутри функции) остаются неинициализированными. Это означает, что ни один из его
элементы установлены на любое конкретное значение; их содержание
неопределенный в точке, где массив объявлен.
Приведенная выше ссылка на самом деле объясняет это очень хорошо, и я никоим образом не связан с ними.