2012-12-13 64 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语句...