#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
的值吗?再次,我一次按值传递,一次按引用传递!我已经在PC上编写了代码,并且确实更改了s
的值。现在我的问题是:为什么?如果我以正确的方式提出这个问题:“在后台”会发生什么?
答案 0 :(得分:6)
a
是s
的副本实际上是一个红色鲱鱼。也许这引起了您的困惑,但这只是一个副本。考虑您可以像这样调用函数
auto temp = s;
eval(temp,nr,s);
以获得完全相同的结果。函数rez
中是对s
的引用,因此对它的修改将反映在s
中的main
上。换句话说,rez
是s
的别名,而a
与s
没有任何关系,它们恰好保持相同的值。
答案 1 :(得分:3)
这个问题与函数参数和引用/指针的行为有关。
将值传递给函数时,它会将您提供的值复制到函数内部的局部变量中。
在您的情况下,当您传递's'时,它会将其复制到'a'中,就像您将在主体中这样做一样:int a = s(发生了这种情况)
引用也相同。当您将“ s”传递给第三个参数时,它将执行以下操作:
int&rez = s
当您通过引用传递它时,它是采用变量的地址而不是值本身并将该地址复制到已经取消引用的局部变量中。 (指针的东西)
因此值更改了。
观看与指针相关的视频,然后在“切尔诺计划”的YouTube频道上进行参考,以更好地理解该主题:
Pointers
References
答案 2 :(得分:2)
简短的回答:是的,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;
}
因此,a
和b
基本上分别只是s
和nr
的副本。但是,res
是 s
。
答案 3 :(得分:1)
IMO,这就是我所期望的:
s
复制到新的变量l_S
。nr
复制到新的变量l_Nr
。&s
复制到新的变量l_Ptr
。l_Nr
和l_S
。*l_Ptr
中。