2013-08-01 165 views
-4

這裏有兩個程序。它們都有一個函數fun(),其返回類型引用一個整數。只有兩個函數的不同之處在於,在一個函數中,x被聲明爲靜態int,而另一個函數不是。第一個問題的輸出是10,第二個問題的輸出是30.如何?這兩個程序的輸出有什麼區別,爲什麼?

程序1:

#include<iostream> 
using namespace std; 

int &fun() 
{ 
    int x = 10; 
    return x; 
} 
int main() 
{ 
    fun() = 30; 
    cout << fun(); 
    return 0; 
} 

計劃2:

#include<iostream> 
using namespace std; 

int &fun() 
{ 
    static int x = 10; 
    return x; 
} 
int main() 
{ 
    fun() = 30; 
    cout << fun(); 
    return 0; 
} 
+2

第一個程序調用未定義的行爲,第二個程序沒有。 – 2013-08-01 19:04:50

+0

什麼是未定義的行爲?你能告訴我爲什麼兩個程序的輸出有差別? – thedarkpassenger

+1

你可以谷歌「未定義的行爲」,你會明白它。 – 2013-08-01 19:06:22

回答

2

程序1:返回到其停止作爲函數返回一旦存在的變量的引用,則存儲該值30到那個不存在的變量,這可能會或可能不會使您的機器崩潰。無論如何,以下調用fun()重新初始化一個局部變量「x」並返回它。程序2:函數範圍中的靜態變量有點像全局變量,它只能被該函數訪問。您返回對該靜態(仍然存在)的引用,並設置其值。當您再次調用該函數時,靜態仍然具有您分配給它的值。