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


#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"的给定函数跟踪它们的总和。我知道将参数传递两次(在这样的给定实例中)而不是使用另一个变量(不过,不确定它是否是坏代码,在我的情况下)可能会被认为是糟糕的代码)。我的问题是:它会改变变量s的值吗?同样,我按值传递一次,按引用传递一次!我已经在我的电脑上编写了代码,它确实改变了s的值。现在我的问题是:为什么?如果我以正确的方式问这个问题:"在后台"会发生什么?

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

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

以获得完全相同的结果。函数内部rez是对s的引用,因此对它的修改将反映在main中的s上。换句话说,rezs的别名,而as没有任何关系,它们恰好具有相同的值。

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

简短回答:是的,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;
}

因此,基本上,ab分别只是snr的副本。但是,res s.

IMO,这就是我所期望的:

  1. s复制到新的变量l_S
  2. nr复制到新的 var l_Nr
  3. &s复制到新的变量l_Ptr
  4. 添加l_Nrl_S
  5. 将结果保存在 *l_Ptr 中。

最新更新