考虑以下计划:(参见现场演示here.)
string str = StreamReaderTest.ReadToEnd();
str.Split(/*entry delimiter*/);
我原本希望得到程序输出为3.0,但它给出了输出0.为什么?
看起来变量d2是静态初始化的吗?
不应该动态初始化吗?
我在g ++ 4.8.1,4.9.2& MSVS 2010&获得0作为输出。
答案 0 :(得分:3)
C++
文件中的变量从上到下进行初始化。因此,在m
之后初始化d
。
还有其他一些细微之处。
当编译器可以解决它时,它有时会发出变量的数据定义 - 将值设置为已知常量。这些在程序加载之前发生。
然后初始化的顺序是代码段 - 就像构造函数一样。这些段在编译单元中从上到下出现。
在你的情况下d=m
我认为从插槽中复制m的值。哪个设置为0.0
然后调用m=fun()
,使用正确的值复制插槽。
答案 1 :(得分:1)
是的,d2
和m
都有静态存储持续时间,因为它们在命名空间范围内被声明,未修饰。
这意味着在任何其他初始化发生之前,它们是零初始化作为第一步。然后,d2
设置为m
。只有在之后,m
变为3.0
。
考虑以下内容,基本上是一回事:
int main()
{
int x = 0, y = 0;
y = x;
x = 3;
}
显然,在这里,期望y
等于3
是毫无意义的,但那是你正在做的事情。
如果你期望初始化发生在函数 - static
变量上,初始化在第一次使用时发生(排序),你就错了。