【问题标题】:Understanding Pass-By-Value-Result了解传递值结果
【发布时间】:2017-12-09 07:21:49
【问题描述】:

考虑以下程序

int i;
int a[2];
void foo(int x, int y)
{
    x++;
    i++;
    y++;
}

main()
{
    a[0] = 1;
    a[1] = 1;
    i = 0;
    foo(a[i], a[i]);
    print(a[0]);
    print(a[1]);
}

我正在努力理解 pass-by-value-result。然而没能把握住。我知道它类似于传递引用。但以什么方式?在上述情况下,结果有何不同?它何时实际使用值的“参考”?

【问题讨论】:

  • “我知道它类似于传递引用。” 相似是什么意思?
  • 除非出现混叠,否则它们不相似吗?

标签: pass-by-reference pass-by-value


【解决方案1】:

可能在您发布的代码中,您想要“foo(a[i], a[i]);”而不是“p(a[i], a[i]);”。

无论如何,您的 a[0] 和 a[1] 将保持设置为 1,因为 foo() 按值获取参数,并且 foo() 无法以外部可见的方式更改其参数.

按值传递和按引用传递相似,只是因为它们都执行“传递”。按值传递涉及数据的复制: foo() 接收 a[0] 的副本和 a[1] 的副本; foo() 称它们为 x 和 y。然后 foo() 递增两者,但 x 和 y 是副本,只有 foo() 可见,所以实际上什么都不会发生,因为在递增之后不再使用 x 和 y。

在 foo() 内部有一个变量 i 的增量,它是全局变量。这一次,变量得到了真正的修改,并且每个人都可以看到更改。

通过引用传递是不同的,因为 foo() 将接收变量的地址(引用),而 foo() 将能够读取但也可以“写入”该引用,从而修改对象的生存状态在那里。

想想这个例子。我是 main(),你是 foo()。我有一张纸,上面写着什么,说一首歌的名字。我可以让你知道这首歌的名字,方法是拿另一张纸,把名字抄在上面,然后把新的纸给你。这是按值传递。

如果我对您说:“工作表在桌子上”(表格是数据的位置,“参考”),那就不同了。你去那里,看看表,所以你知道歌曲的标题。但你也可以修改我放在桌子上的工作表。这是通过引用传递:我告诉你数据在哪里。当然,准确地说,我告诉你这张纸在哪里的方式,是取另一张纸,在上面写“有标题的纸在桌子上”,然后我给你新的纸。你,foo(),收到一张表(按值传递),你也可以销毁或修改它,我永远不会注意到。但是在修改这张迟早没用的新表之前,用它来看看桌子,不要用上面的歌曲名称修改MY sheet! :-)

【讨论】:

  • 我理解 pass-by-value 和 pass-by-reference,但是 pass-by-value-result 呢?这不是另一回事吗?
  • @NewbieCoder 在这种情况下,我不明白这个问题。在发布的代码中没有“结果”;似乎代码应该显示通过引用传递参数时会发生什么,但事实并非如此。
  • 好吧,我的问题实际上是关于pass-by-value-result。代码中会打印什么?
  • @NewbieCoder "a[0] = 1; a[1] = 1;";然后没有任何东西修改它们,所以“1, 1”将被打印出来。假设这段代码看起来是纯 C 语言。这是因为它们是按值传递的(C 语言没有“按引用传递”)。
  • pass-by-value-result 怎么样?不是pass-by-value。我确实明白,对pass-by-value 所做的任何修改都不会受到影响,但pass-by-value-result 有什么用?
【解决方案2】:

结果是:

2

1

这是因为在按值传递结果中,对调用函数中的变量所做的任何修改,在函数退出之前都不会更新。

在同一个程序中,使用传递引用,

3

1

将被打印,因为它引用相同的地址并立即更新所做的任何修改。

【讨论】:

    猜你喜欢
    • 2014-04-14
    • 2014-09-14
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2011-04-10
    • 1970-01-01
    相关资源
    最近更新 更多