【问题标题】:Pass-by-value vs pass-by-reference vs pass-by-value-result值传递 vs 引用传递 vs 值传递结果
【发布时间】:2014-09-14 00:27:44
【问题描述】:

我有这个问题,我对要打印的内容有点困惑,尤其是通过引用传递。如果有两个参数,将传递给 x 什么值?谢谢!

考虑以下程序。对于以下每个参数传递方法,打印什么?

一个。按值传递

b.通过引用传递

c。按值结果传递

void main()
{
    int x = 5;
    foo (x,x);
    print (x);      
}

void foo (int a, int b)
{
    a = 2 * b + 1;
    b = a - 1;      
    a = 3 * a - b;
}

【问题讨论】:

  • 你的猜测是什么?
  • 你试过运行它吗?
  • 这是一个测试题,所以我没有尝试运行它。如果我不得不猜测,我会说 a 会打印 5,b 会打印 23,c 会打印 23。B 给我带来了麻烦,因为 x 会被设置为 23 还是会保持在 5 如果通过引用传递?
  • 到底什么是“通过价值结果”?我认为自己非常了解 C++,但到目前为止我所想到的任何解释都不太可能。
  • 那么它会打印 5、5 和 23 吗?还是 5、5 和 5?

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


【解决方案1】:

前两个应该非常简单,最后一个可能会让您感到困惑,因为它实际上并不是 C++ 支持的构造。这是前段时间在 Fortran 和 Ada 中看到的东西。请参阅this post 了解更多信息

至于你的结果,我想这就是你会得到的:

1)

5

2)

x = 5,
a = 2 * 5 + 1 = 11
b = 11 - 1 = 10
a = 3 * 10 - 10 = 20;  // remember, a and b are the same reference!
x = 20

3) 考虑一下这个(C++ 风格)。我们将复制 x 到一个变量中,通过引用传递它,然后将结果复制回x:

void main()
{
    int x = 5;
    int copy = x;
    foo (copy,copy);  // copy is passed by reference here, for sake of argument
    x = copy;
    print (x);      
}

由于 foo 函数中的任何内容都没有直接对 x 执行任何操作,因此您的结果将与 #2 中的相同。

现在,如果我们为foo 提供类似的东西

void foo (int a, int b)
{
    a = 2 * b + 1;
    x = a - 1;      // we'll assume x is globally accessible
    a = 3 * a - b;
}

那么 #2 会产生相同的结果,但 #3 会像这样出现:

a = 2 * 5 + 1 = 11
x = 11 - 1 = 10  // this no longer has any effect on the final result
a = 3 * 11 - 11 = 22
x = 22

【讨论】:

  • ab 不会通过值结果传递单独副本吗?实际上,这两种方式听起来都像反对这种传递方法的参数......(基本上:在同一个函数调用中将“引用”传递给同一个对象的独立性以及它们以什么顺序“复制”回来吗?)
猜你喜欢
  • 1970-01-01
  • 2017-01-19
  • 2011-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2015-10-01
相关资源
最近更新 更多