C++ C++;传递引用和传递值函数的副作用?

C++ C++;传递引用和传递值函数的副作用?,c++,pass-by-reference,pass-by-value,C++,Pass By Reference,Pass By Value,我明白为什么它会这样 #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: " <

我明白为什么它会这样

#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;
}
但是我不明白为什么这种语法的改变会改变答案(只是把算术和打印结果放在同一行)


您遇到了未定义的行为。第二个版本修改在第二个
cout
中读取的
a
的值2次,两次读取之间没有序列点

第一版:

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

第二个代码的行为完全依赖于系统/编译器。在DEV C++中,第二个代码与第一个代码相同。这取决于编译器如何在程序集中生成cout语句…

如何修复此未定义的行为以更正此问题?@stackoverflow您不需要这样做。:)您使用第一个版本(两个独立的
cout
语句)而不是第二个版本;一个按引用传递,一个按值传递。那么,你会如何正确地处理这些问题呢。我的目标是在发送第二个函数时更改局部变量。@stackoverflow您的操作是正确的,只是第二个
cout
部分出错。@stackoverflow阅读此内容-
#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;
}
Answer: 5 local_A Value: 10
Answer: 5 local_A = Value: 10
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