提问人:M.Ionut 提问时间:1/31/2019 最后编辑:M.Ionut 更新时间:5/29/2022 访问量:958
如果参数被传递两次,会发生什么情况?一次按值,一次按引用?会不会修改?
What happens to a parameter if it is passed twice? Once by value and once by reference? Will it be modified or not?
问:
#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 上编写了代码,它确实更改了 的值。现在我的问题是:为什么?如果我以正确的方式问这个问题:“在后台”会发生什么?s
s
答:
事实上,这是一个副本,实际上是一条红鲱鱼。也许这引起了你的困惑,但它只是一个副本。考虑您可以像这样调用函数a
s
auto temp = s;
eval(temp,nr,s);
以获得完全相同的结果。函数内部是对 的引用,因此对它的修改将反映在 中。换句话说,是 的别名,而与 没有任何关系,它们只是碰巧具有相同的值。rez
s
s
main
rez
s
a
s
IMO,这就是我所期望的:
- 复制到新的 var 。
s
l_S
- 复制到新的 var 。
nr
l_Nr
- 复制到新的 var 。
&s
l_Ptr
- 添加和 .
l_Nr
l_S
- 将结果保存在 中。
*l_Ptr
这个问题与函数、参数和引用/指针的行为有关。
当您将值传递给函数时,它会将您提供的值复制到函数内部的局部变量。
在你的例子中,当你传递'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
上一个:递归和引用传递的参数
评论
a
是 的副本。 是 .我不清楚你不确定什么。s
rez
s