C++传值和传引用函数的副作用是什么?

3
我理解为什么它能够正常工作。
#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;
}

输出:

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;
}

输出:

Answer: 5 local_A Value: 10
Answer: 5 local_A = Value: 10
2个回答

5
你遇到了“未定义行为”。第二个版本修改了变量a的值,而你在第二个cout中读取了这个值两次,在这两次读取之间没有序列点。
第一个版本:
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

我该怎么做才能修复这个未定义的行为以解决这个问题? - stackoverflow
2
@stackoverflow 你不要这样做。 :) 你应该使用第一种版本(两个单独的 cout 语句),而不是第二种。 - Luchian Grigore
1
好的,那么这个小程序的目的是执行两个不同的功能;一个是通过引用传递,另一个是通过值传递。那么你会如何正确地执行每个功能呢?我的目标是在发送到第二个函数时更改局部变量。 - stackoverflow
1
@stackoverflow,您做得很正确,只是第二个“cout”部分有误。 - Luchian Grigore
1
@stackoverflow 请阅读此内容 - https://dev59.com/Zm855IYBdhLWcg3wuG-W - Luchian Grigore
显示剩余2条评论

0

第二段代码的行为完全取决于系统/编译器。在 Dev C++ 上,第二段代码的输出与第一段相同。这取决于编译器如何在程序汇编中构建 cout 语句...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接