2012-12-13 66 views
3

我明白爲什麼這個工程,因爲它確實C++按引用傳遞並按值傳遞副作用?

#include <iostream> 
using namespace std; 

int additionFive (int a) 
{ 
    a = a - 5; 
    return a; 
} 

int subtractFive (int &a) 
{ 
    a = a -5; 
    return a; 
} 

int main() 
{ 
    int local_A = 10; 

    cout << "Answer: " << additionFive(local_A) << endl; 
    cout << "local_A Value "<< local_A << endl; 

    cout << "Answer: " << subtractFive(local_A) << endl; 
    cout << "local_A = Value "<< local_A << endl; 

    return 0; 
} 

OUTPUT:

Answer: 5 
local_A Value 10 
Answer: 5 
local_A = Value 5 

但我不明白爲什麼語法的這種變化改變了答案(簡單地把算術和打印在同一行)

#include <iostream> 
using namespace std; 

int additionFive (int a) 
{ 
    a = a - 5; 
    return a; 
} 

int subtractFive (int &a) 
{ 
    a = a -5; 
    return a; 
} 

int main() 
{ 
    int local_A = 10; 

    cout << "Answer: " << additionFive(local_A) << " local_A Value: "<< local_A << endl; 
    cout << "Answer: " << subtractFive(local_A) << " local_A = Value: "<< local_A << endl; 

    return 0; 
} 

OUTPUT:

Answer: 5 local_A Value: 10 
Answer: 5 local_A = Value: 10 

回答

5

您正在遇到未定義的行爲。第二個版本修改了您在第二個cout中讀取的a的值,兩次讀取之間沒有序列點。

第一個版本:

cout << "Answer: " << subtractFive(local_A) << endl; 
//        |     | 
//     reads and modifies local_A  | 
//           sequence point 
cout << "local_A Value ="<< local_A << endl; 
//        | 
//      reads local_A 

第二個版本:

cout << "Answer: " << subtractFive(local_A) << " local_A Value: "<< local_A << endl; 
//        |          | 
//     reads and modifies local_A     reads local_A 
+0

我該怎麼辦解決這個未定義的行爲來糾正這個問題? – stackoverflow

+2

@stackoverflow你不這樣做。 :)你使用第一個版本(2個獨立的'cout'語句),而不是第二個版本。 –

+0

好吧,這個小程序的重點是做兩個不同的功能;一個做參照,一個做價值傳遞。那麼你如何正確地做那些事呢?我的目標是在發送第二個函數時更改局部變量。 – stackoverflow

0

那麼第二個代碼的行爲完全是系統/編譯器的依賴。在Dev C++上,第二個代碼給出與第一個相同的輸出。這取決於編譯器如何在程序彙編中構建cout語句...