2015-06-19 108 views
1

我最近閱讀了關於C++中的引用。我意識到引用的基本屬性,但我仍然無法弄清楚爲什麼下面兩個程序產生不同的輸出。參考文獻 - 爲什麼以下兩個程序產生不同的輸出?

#include<iostream> 
using namespace std; 

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

該程序打印30作爲輸出。根據我的理解,函數fun()返回一個對由x佔用的內存位置的引用,然後將其賦值爲30,並在第二次調用fun()時忽略賦值語句。 現在考慮這個方案:

#include<iostream> 
using namespace std; 

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

該程序生成的輸出爲10。是否因爲在第一次呼叫後x被分配了30,並且在第二次呼叫後它又被覆蓋爲10,因爲它是一個局部變量?我錯了嗎?請解釋。

回答

3

在第一種情況下,fun()將返回對同一個變量的引用,無論您調用多少次。

在第二種情況下,fun()在每次調用時都會返回一個不同變量的懸掛引用。函數返回後,該引用無效。

當您在第二種情況下使用

fun() = 30; 

,你設置一個變量,它是不再有效的價值。理論上說,這是未定義的行爲。

當您在第二種情況下第二次調用fun()時,變量x設置爲10。這與第一次調用相同函數無關。

0

只是增加了所說的。第一個案件行爲背後的原因是因爲它是一個static變量,它具有一個靜態持續時間。靜態持續時間意味着對象或變量在程序啓動時分配,並在程序結束時解除分配。

這意味着,一旦x在第一種情況下已經與10初始化第一次,接下來的函數調用會忽略static int x = 10;因爲x不能再實例化,因爲它已經被分配,而只會繼續return x;,這將與main中被分配爲30x相同。

0

基本上,你的理解是正確的,除了第二種情況,你正在處理一個懸而未決的局部變量引用已經無效,這是未定義的行爲,意味着任何事情都是可能的。你所說的只是其中一種可能性,它也可能導致其他人,比如得到一個隨機數,程序崩潰等。

相關問題