2012-02-29 46 views
1

我已經創建了一個C++程序,以測試通過引用爲函數傳遞參數的功能。C++ - 在返回int的函數中通過引用傳遞參數

#include <iostream> 

using namespace std; 

int f(int &b) { 
    b = b + 1; 
    cout << b << endl; 
    return b; 
} 

int main() { 
    int t = 10; 

    cout << f(t) << " " << t << endl; 
    //cout << f(&t) << " " << t << endl; 

    system("PAUSE"); 

    return 0; 
} 

可否請你向我解釋爲什麼這一計劃將不f功能執行後影響的t價值?傳入的b參數是引用,所以我認爲它的值會在程序執行後發生改變,因爲我正在使用主函數的實際變量,而不是它的副本。在這種情況下,我希望它是11,但它不受程序執行的影響。

這是怎麼發生的?

回答

5

t的值得到遞增。你會看到這一點,如果你一分爲二的輸出語句:

cout << f(t) << endl; 
cout << t << endl; 

與原有單一的輸出語句:

cout << f(t) << " " << t << endl; 

編譯器是免費的f(t)之前評估t,在生產你看到的輸出。欲瞭解更多信息,請參閱cout << order of call to functions it prints?

+0

是的,但爲什麼它不會增加?是不是通過引用傳遞?它應該在'main'函數中被修改嗎? – Simon 2012-02-29 16:48:48

+0

這是,只是你沒有得到你所期望的訂單,所有的產出在一條線上。將它拆分爲兩個保證事情按照您希望的順序發生。 – BoBTFish 2012-02-29 16:50:31

+1

@Simon:不,它會增加't'。發生的事情是獲取**打印**的值是函數調用之前的值。看到我更新的答案。 – NPE 2012-02-29 16:50:58

0

你的代碼是未定義行爲,因爲它不是在一份聲明中副作用發生在什麼時候確定。

它類似於

cout << i++ << ++i; 

取決於編譯器,你可能會得到不同的結果。

0

我會想象你遇到涉及sequence points的問題。您正在修改並在相同的表達式中打印t的值。

編譯器決定評估的順序t以及何時決定評估f(t)未定義。所以這個函數可能不會像你想象的那樣先被調用。

如果將打印分成兩個語句,那麼您將看到t實際上已更改。例如:

cout << f(t) << " "; 
cout << t << endl; 

會產生您期望的輸出。

0

該語言沒有指定評估操作符參數的順序,所以在函數調用之前或之後,您的cout表達式的值是t,因此未指定。

你會看到預期的結果,如果你介紹一個序列點,也許拆分爲兩個表達式:

cout << f(t) << " "; 
cout << t << endl; 
0

你絆倒輸出順序。正如指出的那樣,t確實得到遞增,但是您可能在輸出的順序上感到困惑。

但是,我喜歡側重於解決問題,試圖弄清楚如何讓人們理解不僅僅是眼前的問題,而是爲什麼他們首先遇到困難,這裏我很清楚。

您需要了解調試器。

通過使用一個,你可以通過你的代碼退一步,看看在任何給定的點t的價值,也看到,幾乎沒有在你的任何努力,這確實得到增加(確切地包括何時以及如何) 。通過使用包括遞歸等概念的調試器來追蹤代碼的工作方式,您也可以更好地理解代碼是如何工作的。

我建議你馬上開始,因爲它會打開你的眼睛,看看代碼是如何工作的,而不用猜測你的輸出語句。

相關問題