按值传递结果? [复制]

Posted

技术标签:

【中文标题】按值传递结果? [复制]【英文标题】:Pass-by-value-Result? [duplicate] 【发布时间】:2011-08-11 17:48:05 【问题描述】:

可能的重复:pass by reference or pass by value?

我很难理解 Pass-by-Value-Result 方法。我了解 Pass-by-ReferencePass-by-Value,但我不太清楚 Pass-by-Value-Result .它与 Pass-by-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;


如果使用 Pass-by-Value-Result 方法,目标是确定 valuelist 的值。 (不是按值传递)。

【问题讨论】:

查看您的代码,对swap() 的调用没有外部影响。它们的参数是按值传递的。我认为在这种情况下,“按值传递结果”是“如果swap() 使用按值传递结果是什么?”的写得不好的版本。我可能会认为“按值传递结果”意味着“按值传递的函数结果”(即不返回引用或指针),但这在这里没有意义,因为swap() 不返回任何内容。 @Mike 好的,有时 pass-by-value-result 被称为 pass-by-copy。如果有帮助 仍然看不出这与传递值之间的区别。 我假设“子程序”在这里只是“功能”的另一个词。 “......然后在子程序终止时复制回来。”等等,什么? C++ 有一个机制来做到这一点?我知道在函数终止时被显式复制回来的唯一一件事是返回值,并且允许优化器删除该副本。 @Willy:按值传递结果不是一回事。在 C++ 中传递对象有 3 种方法。按值传递、按引用传递和按常量引用传递。 【参考方案1】:

如果您通过值传递,那么您将在方法中复制变量。这意味着对该变量所做的任何更改都不会发生在原始变量上。这意味着您的输出将如下所示:

2   1
1   3
2   5

如果您通过引用传递,即传递变量的地址(而不是复制),那么您的输出将会不同,并且会反映在 swap(int a, int b) 中进行的计算。你有没有运行这个来检查结果?

编辑 在做了一些研究之后,我发现了一些东西。 C++ 不支持 Pass-by-value-result,但可以模拟。为此,您创建变量的副本,通过引用将它们传递给您的函数,然后将原始值设置为临时值。请参阅下面的代码..

#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;


这将为您提供以下结果:

1   2
3   2
2   1

这种传递也称为Copy-In、Cop​​y-Out。 Fortran 使用它来使用它。但这就是我在搜索过程中发现的全部内容。希望这会有所帮助。

【讨论】:

对不起,这令人困惑,但是是的,我已经运行了这些结果并得到了这些值传递的答案。但我所说的是传递值结果,它不同于传递值。 谢谢你的帮助。 如果是复制输入,复制输出不应该将值复制到临时变量,调用交换,并在交换调用后重新分配目标值吗?第一个电话看起来是对的,但如果我理解正确,你想传入temp1temp2 以每次交换。【参考方案2】:

使用引用作为参数,例如:

void swap(int &a, int &b)


  int temp;
    temp = a;
    a = b;
    b = temp;

a 和 b 现在将保存实际值。

【讨论】:

以上是关于按值传递结果? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 是按引用传递还是按值传递? [复制]

Ruby 是按值传递还是按引用传递? [复制]

在 Ruby 中按值传递是啥意思? [复制]

按引用传递然后复制和按值传递在功能上是不是不同?

作为参数的函数是不是必须按值传递? [复制]

ECMAScript 中所以函数的参数都是按值传递