按价值/价值结果调用

时间:2016-05-04 17:47:15

标签: parameter-passing

我获得了以下代码,并询问它将打印出来的内容取决于它的调用方式:

int a;
procedure foo(int x){
x = x + 10;
a = a + x;
}
procedure fie( ){
a = 5;
foo(a);
print (a);

它要求call by valuecall by value-result

对于按值调用,我知道它会得到20,因为你最终将10加到x中,其中值为5,然后在原来的a中加15,后者变为20。

我的问题是为什么call by value-result打印15?有人可以给我一个很好的解释,我对value-resultvalue彼此之间的差异以及value-result如何实际解释感到困惑。

2 个答案:

答案 0 :(得分:3)

给出的示例仅涉及按值调用'这就是印刷值为20的原因。 如果通过价值结果调用'调用者提供的实际参数被复制到被调用者的形式参数中; 然后当函数运行时,可以在函数体内的任何地方修改形式参数,但只有当函数退出修改后的形式参数时才会被复制回调用者。 如果通过引用打电话'别名'别名'在形式参数和实际参数之间创建,并且对形式参数的任何修改都会反映到调用者参数。

使用支持'按值 - 结果'

调用的语言编写代码
void test(IN OUT int c; REF int d)
{
     printf ("a: %d b: %d c: %d d: %d\n", a,b,c,d);
     a = 0; b = 9; c = 4; d = 6; 
     printf ("a: %d b: %d c: %d d: %d\n", a,b,c,d);
}
void main(void) 
{
      int a = 5, b = 7;
      test(a,b);
      printf ("a: %d b: %d\n",a,b);
}

结果应为

 a: 5 b: 7 c: 5 d: 7
 a: 0 b: 6 c: 4 d: 6  // d and b are aliases, so b=9 is modified by d = 6 
 a: 4 b: 6            // a replaced with value of c on function exit.

所以在你的情况下: 按值调用

输入函数

a = 5

x = 5 + 10 = 15
然后我们有了' a'作为全局变量

a = 5 + x = 5 + 15 = 20 

然后打印a = 20

在价值结果调用的情况下 进入功能时

x = 5 + 10 = 15
a = 5 + 15 = 20

但是当函数返回时,如果x被复制到' a'结果a = 15 然后印刷品是15

答案 1 :(得分:2)

注意:我之前的回答是错误的。它现在已得到纠正。

C / C ++不会实现Call-By-Value-Result(本机)之类的任何内容。据我了解,这是一个ADA术语(致力于政府代码?)。 Call-By-Value将导致15,Call-By-Reference是最棘手的,因为您将在第3行以及示例的第4行修改a

- 编辑 -

我已经实现了以下代码,我认为这是所描述语法的有效表示(我不熟悉ADA直接进行测试,也许其他人可以)。如您所见,By-Value-Result的结果为15.

#include <iostream>


int a_v, a_r, a_vr;

void foo_by_val(int x)
{
  x = x + 10;
  a_v = a_v + x;
}

void foo_by_ref(int &x)
{
  x = x + 10;
  a_r = a_r + x;
}

void foo_by_value_result(int &x_ref)
{
  int x = x_ref;
  x = x + 10;
  a_vr = a_vr + x;
  //  x = x_ref;  <-- My previous mistake
  x_ref = x;
}


void fie( ){
  a_v = 5;
  a_r = 5;
  a_vr = 5;


  foo_by_val(a_v);
  foo_by_ref(a_r);
  foo_by_value_result(a_vr);


  std::cout << "By Value: " << a_v << std::endl;
  std::cout << "By Refference: " << a_r << std::endl;
  std::cout << "By Value Result: " << a_vr << std::endl;

}

int main()
{
  fie();
  return 0;
}

结果:

By Value: 20
By Reference: 30
By Value Result: 15