1

考虑以下程序:(请参阅此处的现场演示。

#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 作为输出。

4

2 回答 2

3

文件中的变量C++从上到下初始化。所以m在之后初始化d

还有一些其他的微妙之处。

当编译器可以解决它时,它有时会发出变量的数据定义 - 将值设置为已知常量。这些发生在程序加载之前。

然后初始化的顺序是代码段——比如构造函数。这些段在编译单元中从上到下出现。

在您的情况下d=m,我认为从插槽中复制 m 的值。设置为 0.0

然后m=fun()调用,用正确的值复制槽。

于 2015-09-27T15:11:07.557 回答
1

是的,两者都d2具有m静态存储持续时间,因为它们是在命名空间范围内声明的、未修饰的。

这意味着它们在任何其他初始化发生之前作为第一步被零初始化。然后,d2设置为m。直到那之后,才m变成3.0

考虑以下内容,这本质上是相同的:

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

显然,在这里,期望y等于是无稽之谈3,但这就是您正在做的事情。

如果您希望初始化像函数static变量一样发生,初始化发生在第一次使用时(排序),那您就错了。

于 2015-09-27T15:05:49.203 回答