【问题标题】:Pass by Reference vs Pass by value result按引用传递与按值传递结果
【发布时间】:2017-01-19 07:23:00
【问题描述】:

通过引用调用使形参成为别名,因此典型参数的每次更改也会影响形参,而传递值-结果将结果复制到典型参数,当函数返回时,它将典型参数复制到正式的。(注意,按值调用的结果与按值调用完全不同)。

除了这两种传参方式的实现方式不同之外,在我看来最终的结果应该是一样的。

我的问题是这两种方法是否总是给出相同的结果,或者你能举一个这两种方法返回不同结果的例子吗?

【问题讨论】:

  • 我认为您误解了按值传递。实际上传值对形式参数没有任何影响。
  • @M.Amini ,值传递和值结果是完全不同的东西。
  • @Henk Holterman,用于fortran,你可以阅读这个stackoverflow.com/questions/718140/…,它也因此被称为copy in-copy out。你也可以检查:en.wikipedia.org/wiki/Evaluation_strategy,是它被称为复制恢复或复制复制输出或值返回。
  • 嗯,那就对了,因为我不懂 Fortran。但这不是通常所说的按值传递。您可能希望对此更准确。
  • @Henk Holterman,我也不懂fortran,我在大学课上学过参数传递(从值结果中有更多奇怪和奇怪的方法),我想我很清楚我问过价值结果而不是价值,这就是我在开始时更清楚地描述它的原因,而且我在上面的评论中声明它与按值调用不同......

标签: parameters parameter-passing programming-languages pass-by-reference


【解决方案1】:

如果在方法过程中读取原始变量,那将会有所不同。这可能是因为:

  • 两个参数均使用相同的基础变量提供
  • 该方法调用了更多从原始变量中读取的代码
  • 涉及其他线程

这是一个 C# 示例:

using System;

class Test
{
    static void Main()
    {
        int p = 10;
        Foo(ref p, () => Console.WriteLine(p));
    }

    static void Foo(ref int x, Action action)
    {
        action();
        x = 20;
        action();
    }
}

这个的输出是

10
20

... 因为第二次调用action() 时,p 的值已经变为 20。如果使用 pass-by-result,p 的值只有在 @987654326 时才会改变@返回。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 2023-03-02
    • 2012-07-03
    • 1970-01-01
    • 2013-04-12
    相关资源
    最近更新 更多