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

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 に答える