如果参数被传递两次,会发生什么情况?一次按值,一次按引用?会不会修改?

What happens to a parameter if it is passed twice? Once by value and once by reference? Will it be modified or not?

提问人:M.Ionut 提问时间:1/31/2019 最后编辑:M.Ionut 更新时间:5/29/2022 访问量:958

问:

#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("BAC.TXT");
void eval(int a, int b, int &rez)
{
    rez = a + b;
}
int main()
{
    int nr;
    int s;
    fin >> s;
    while (fin >> nr)
        eval(s, nr, s);
    cout << s << '\n';
    return 0;
}

所以我有这个代码片段。我正在从文件中读取数字,并使用名为“eval”的给定函数跟踪它们的总和。我知道两次传递一个参数(在这样的给定实例中)而不是使用另一个变量可能被认为是坏代码(但不确定它是否是坏代码,在我的情况下)。我的问题是:它会改变变量的值吗?同样,我通过值传递一次,通过引用传递一次!我已经在我的 PC 上编写了代码,它确实更改了 的值。现在我的问题是:为什么?如果我以正确的方式问这个问题:“在后台”会发生什么?ss

C++ 参数 按引用传递

评论

5赞 François Andrieux 1/31/2019
a是 的副本。 .我不清楚你不确定什么。srezs

答:

6赞 463035818_is_not_an_ai 1/31/2019 #1

事实上,这是一个副本,实际上是一条红鲱鱼。也许这引起了你的困惑,但它只是一个副本。考虑您可以像这样调用函数as

auto temp = s;
eval(temp,nr,s);

以获得完全相同的结果。函数内部是对 的引用,因此对它的修改将反映在 中。换句话说,是 的别名,而与 没有任何关系,它们只是碰巧具有相同的值。rezssmainrezsas

1赞 Indetronable 1/31/2019 #2

IMO,这就是我所期望的:

  1. 复制到新的 var 。sl_S
  2. 复制到新的 var 。nrl_Nr
  3. 复制到新的 var 。&sl_Ptr
  4. 添加和 .l_Nrl_S
  5. 将结果保存在 中。*l_Ptr
3赞 Narice 1/31/2019 #3

这个问题与函数、参数和引用/指针的行为有关。
当您将值传递给函数时,它会将您提供的值复制到函数内部的局部变量。
在你的例子中,当你传递's'时,它会把它复制到'a',就像你在main中这样做一样:int a = s(这就是正在发生的事情)
这同样适用于引用。当你将's'传递给第三个参数时,它会这样做:
int &rez = s
当你通过引用传递它时,它有点像是获取变量的地址而不是值本身,并将这个地址复制到已经取消引用的局部变量。(指针的东西)
所以值被改变了。
观看与指针相关的视频,然后在“切尔诺项目”youtube 频道上参考,以更好地理解该主题:
指针
参考

评论

0赞 Narice 1/31/2019
但引用与指针密切相关,OP应该掌握指针,才能充分理解引用及其后台
1赞 463035818_is_not_an_ai 1/31/2019
tbh 我完全不同意,但我明白你的观点是完全有效的;)
2赞 sebrockm 1/31/2019 #4

简短的回答:是的,会改变。s

长答案:让我稍微重写一下您的代码片段,以说明调用期间函数参数发生了什么:

#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("BAC.TXT");
void eval(int a, int b, int &rez)
{
    rez = a + b;
}
int main()
{
    int nr;
    int s;
    fin >> s;
    while(fin >> nr) {
        int a = s;
        int b = nr;
        s = a + b;
    }
    cout << s << '\n';
    return 0;
}

所以,基本上,和 只是 和 的副本。但是,.absnrress