Рассмотрим следующую программу: (см. Живую демонстрацию Вот.)
#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 в качестве выхода.
Переменные в пределах C++
файл инициализируется сверху вниз. Так m
инициализируется после d
,
Есть и другие тонкости.
Когда компилятор может это решить, он иногда выдает определения данных для переменных, устанавливая значение в известную константу. Это происходит до загрузки программы.
Тогда порядок инициализации кода сегментов — как конструкторы. Эти сегменты встречаются сверху вниз в модуле компиляции.
В твоем случае d=m
Я думаю, что копирует значение из слота для м. Который установлен на 0,0
затем m=fun()
вызывается, копируя слот с правильным значением.
Да, оба d2
а также m
имеют статическую длительность хранения, потому что они объявлены как недекорированные в области имен.
Это означает, что они нулевой инициализируется в качестве первого шага, прежде чем произойдет любая другая инициализация. Затем, d2
установлен в m
, Это не до после что, это m
становится 3.0
,
Рассмотрим следующее, что по сути одно и то же:
int main()
{
int x = 0, y = 0;
y = x;
x = 3;
}
Понятно, что здесь глупости ожидать y
быть равным 3
Но это то, что вы делаете.
Если вы ожидали, что инициализация произойдет, как для функцииstatic
переменные, где инициализация происходит при первом использовании (вроде, как бы, что-то вродеВы ошиблись.