提问人:Lionel 提问时间:10/15/2020 最后编辑:underscore_dLionel 更新时间:10/15/2020 访问量:79
请帮我澄清C++按值传递?
please help me clarify C++ pass by value?
问:
struct rec {
int length;
int breath;
};
int area(rec objrec1) {
objrec1.length ++;
//objrec1.breath;
//int result= objrec1.length++ * objrec1.breath;
return(objrec1.length++ * objrec1.breath);
//return(result);
}
int main() {
rec objrec = { 10,5 }; // create object to access struct
int arearesult;
arearesult = area(objrec); // we pass the whole struct into the parameter
cout << arearesult << endl;
}
我的问题是,如果实际参数没有对形式参数进行更改,那么返回到主“arearesult”时长度 (++) 的增量如何影响结果,使答案为 55 而不是 50。因为我在想,如果我将长度增加 1 使其为 11,但是当它到达 main() 时,它将变得无效并变回 10,因为实际参数和形式参数中的长度不同。谢谢
答:
2赞
463035818_is_not_an_ai
10/15/2020
#1
您的问题可以归结为:
#include <iostream>
int foo ( int x ) {
x = 42;
return x;
}
int main {
int a = 1;
int b = 2;
a = foo( b );
std::cout << a << ' ' << b;
}
b
按值传递。它不会通过调用 来修改,因为会修改 的副本。 不传递给函数,但获取分配的返回值。在那之后,它的价值与以前不同。foo
foo
b
a
in main 的值是 ,因为这是从 返回的值。返回后,和 之间没有神奇的隐藏依赖关系。a
42
foo
foo
a
b
评论
1赞
underscore_d
10/15/2020
x = 42; return x
可能更清楚,因为 OP 似乎认为这句话意味着结果会“跟踪”,以至于它会恢复到外部......什么的。return x
x
2
foo()
1赞
Useless
10/15/2020
#2
我在想,如果我将长度增加 1 使其为 11,但是当它到达 main() 时,它将变得无效并变回 10
没有单一变量。您有两个独立的对象,每个对象都有自己的独立对象。length
length
我们可以将您的电话改写为
int main() {
rec objrec = { 10,5 }; // create object to access struct
int arearesult;
// manually inline this call:
// arearesult = area(objrec); // we pass the whole struct into the parameter
// int area(rec objrec1)
{
rec objrec1 = objrec;
objrec1.length ++;
arearesult = objrec1.length++ * objrec1.breath;
} // objrec1 ceases existing here, objrec is unaffected
cout << arearesult << endl;
}
并且您可以看到,除了初始化 .更改不会影响 。objrec
objrec1
objrec1.length
objrec.length
评论
objrec
areresult
objrec
objrec
int