#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
的值。现在我的问题是:为什么?如果我以正确的方式问这个问题:"在后台"会发生什么?
a
是s
的副本这一事实实际上是一个红鲱鱼。也许这引起了您的困惑,但它只是一个副本。考虑你可以像这样调用函数
auto temp = s;
eval(temp,nr,s);
以获得完全相同的结果。函数内部rez
是对s
的引用,因此对它的修改将反映在main
中的s
上。换句话说,rez
是s
的别名,而a
与s
没有任何关系,它们恰好具有相同的值。
这个问题与函数参数和引用/指针的行为有关。
当您将值传递给函数时,它会复制您为函数内的局部变量提供的值。
在您的情况下,当您传递"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;
}
因此,基本上,a
和b
分别只是s
和nr
的副本。但是,res
s
.
IMO,这就是我所期望的:
- 将
s
复制到新的变量l_S
。 - 将
nr
复制到新的 varl_Nr
。 - 将
&s
复制到新的变量l_Ptr
。 - 添加
l_Nr
和l_S
。 - 将结果保存在
*l_Ptr
中。