C++ 通过值结果?
可能的重复项:C++ 通过值结果?,c++,C++,可能的重复项: 我很难理解传递值结果方法。我理解按引用传递和按值传递,但我不太清楚按值传递的结果。按值传递有多相似(假设相似) 这是密码 #include <iostream> #include <string.h> using namespace std; void swap(int a, int b) { int temp; temp = a; a = b; b = temp; } int main() { int value
我很难理解传递值结果方法。我理解按引用传递和按值传递,但我不太清楚按值传递的结果。按值传递有多相似(假设相似) 这是密码
#include <iostream>
#include <string.h>
using namespace std;
void swap(int a, int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int value = 2;
int list[5] = {1, 3, 5, 7, 9};
swap(value, list[0]);
cout << value << " " << list[0] << endl;
swap(list[0], list[1]);
cout << list[0] << " " << list[1] << endl;
swap(value, list[value]);
cout << value << " " << list[value] << endl;
}
#包括
#包括
使用名称空间std;
无效掉期(整数a、整数b)
{
内部温度;
温度=a;
a=b;
b=温度;
}
int main()
{
int值=2;
int list[5]={1,3,5,7,9};
交换(值,列表[0]);
cout如果通过值传递,则在方法中复制变量。这意味着对该变量所做的任何更改都不会发生在原始变量上。这意味着您的输出如下所示:
2 1
1 3
2 5
如果您是通过引用传递的,即传递变量的地址(而不是复制),那么您的输出将不同,并且将反映在swap(int a,int b)中进行的计算。您运行此操作是为了检查结果吗
编辑
在做了一些研究之后,我发现了一些东西。C++不支持传递值结果,但是它可以被模拟。这样做,你就创建了变量的副本,通过引用你的函数传递它们,然后将原始值设置为临时值。
#include <iostream>
#include <string.h>
using namespace std;
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int value = 2;
int list[5] = {1, 3, 5, 7, 9};
int temp1 = value;
int temp2 = list[0]
swap(temp1, temp2);
value = temp1;
list[0] = temp2;
cout << value << " " << list[0] << endl;
temp1 = list[0];
temp2 = list[1];
swap(list[0], list[1]);
list[0] = temp1;
list[1] = temp2;
cout << list[0] << " " << list[1] << endl;
temp1 = value;
temp2 = list[value];
swap(value, list[value]);
value = temp1;
list[value] = temp2;
cout << value << " " << list[value] << endl;
}
这种类型的传递也称为Copy-In,Copy-Out。Fortran使用它。但这就是我在搜索过程中发现的所有内容。希望这能有所帮助。使用引用作为参数,例如:
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}
a和b现在将保留实际值。查看您的代码,对swap()
的调用没有任何外部影响。它们的参数是按值传递的。我认为在这种情况下,“按值传递结果”是“如果swap()
使用按值传递结果如何?”的糟糕版本。我可能会这么想“按值传递结果”表示“按值传递的函数结果”(即不返回引用或指针),但这在这里没有意义,因为swap()
不返回任何内容。@Mike好的,有时按值传递结果指的是按副本传递。如果这有助于直到看不到它和按值传递之间的区别。我假设“子程序”在这里只是“函数”的另一个词。“…然后在子程序终止时复制回来。"等等,什么?C++有一个机制来做这个操作?我知道在函数终止时明确复制的唯一的东西是返回值,优化器被允许去删除那个拷贝。@威利:通过值结果不是一回事。在C++中有3种方法传递对象。很抱歉,这让人困惑,但我已经运行了这些结果,并得到了这些关于传递值的答案。但我所说的是传递值结果,它不同于传递值。谢谢,伙计,我真的很感谢你的帮助。如果是复制入,复制出,你不应该将值复制到临时变量,调用交换,然后重新设置吗是否在交换调用后调整目标值?第一次调用看起来正确,但如果我理解正确,您希望每次都传入temp1
和temp2
进行交换。
void swap(int &a, int &b)
{
int temp;
temp = a;
a = b;
b = temp;
}