C ++ инициализация переменной области имен пространства

Рассмотрим следующую программу: (см. Живую демонстрацию Вот.)

#include <iostream>
inline double fun()
{
return 3.0;
}
extern double m;
double d2=m;
int main()
{
std::cout<<d2;
}
double m=fun();

Я ожидал получить вывод программы как 3.0, но он дает мне вывод 0. Почему?

Похоже, переменная d2 инициализируется статически?

Разве это не должно быть инициализировано динамически?

Я проверял это на g ++ 4.8.1, 4.9.2 & MSVS 2010 & получить 0 в качестве выхода.

1

Решение

Переменные в пределах C++ файл инициализируется сверху вниз. Так m инициализируется после d,

Есть и другие тонкости.

Когда компилятор может это решить, он иногда выдает определения данных для переменных, устанавливая значение в известную константу. Это происходит до загрузки программы.

Тогда порядок инициализации кода сегментов — как конструкторы. Эти сегменты встречаются сверху вниз в модуле компиляции.

В твоем случае d=m Я думаю, что копирует значение из слота для м. Который установлен на 0,0

затем m=fun() вызывается, копируя слот с правильным значением.

3

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

Да, оба d2 а также m имеют статическую длительность хранения, потому что они объявлены как недекорированные в области имен.

Это означает, что они нулевой инициализируется в качестве первого шага, прежде чем произойдет любая другая инициализация. Затем, d2 установлен в m, Это не до после что, это m становится 3.0,

Рассмотрим следующее, что по сути одно и то же:

int main()
{
int x = 0, y = 0;
y = x;
x = 3;
}

Понятно, что здесь глупости ожидать y быть равным 3Но это то, что вы делаете.

Если вы ожидали, что инициализация произойдет, как для функцииstatic переменные, где инициализация происходит при первом использовании (вроде, как бы, что-то вродеВы ошиблись.

1

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