2015-09-27 136 views
1

考慮下面的程序:(見現場演示here.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作爲輸出。

+2

'它看起來像變量d2靜態初始化?'排序。程序加載時,'d2'和'm'都會初始化爲0。然後'd2'從'm'(它仍然是0)初始化。最後,'m'從'fun()'初始化。 –

+1

這是爲什麼?您正在打印'd2',而不是'm'。如果你有'int x = 0; int y = x; x = 42;'',你是否希望'y'被追溯設置爲42? –

+0

[This answer](http://stackoverflow.com/a/22117407/1413133)將會有所幫助。 –

回答

3

C++文件中的變量從上到下進行初始化。所以md之後被初始化。

還有一些其他的微妙之處。

當編譯器可以解決它時,它有時會發出變量的數據定義 - 將一個值設置爲一個已知的常量。這些發生在程序加載之前。

然後,初始化的順序是代碼段 - 就像構造函數。這些段在編譯單元中從上到下發生。

在你的情況下d=m我認爲從m的槽中複製值。其中設置爲0.0

然後調用m=fun(),複製具有正確值的插槽。

1

是的,d2m都具有靜態存儲持續時間,因爲它們在命名空間範圍內聲明爲未修飾。

這意味着它們是零初始化作爲任何其他初始化發生之前的第一步。然後,d2設置爲m。直到之後那個,那m變成了3.0

考慮下面的,基本上是同樣的事情:

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

顯然,在這裏,它是無稽之談期待y等於3,但是這是你在做什麼。

如果您預計的初始化會發生像函數-static變量,初始化發生在第一次使用(排序),您是錯誤的。

+0

@PravasiMeet:不,我不能證明一個否定。相反,你爲什麼不解釋爲什麼這個簡單的答案「仍然是錯誤的」,爲什麼你「不同意」? –

+0

@PravasiMeet:或者你不願意,或者你早先說過要先放棄投票。這個答案只有一個,它仍然存在。 –

+1

@Pravasi:對,另一個證據表明,你沒有刪除你的失望,與你的說法相反。今天充滿謊言:( –