我获得了以下代码,并询问它将打印出来的内容取决于它的调用方式:
int a;
procedure foo(int x){
x = x + 10;
a = a + x;
}
procedure fie( ){
a = 5;
foo(a);
print (a);
它要求call by value
和call by value-result
对于按值调用,我知道它会得到20,因为你最终将10加到x中,其中值为5,然后在原来的a中加15,后者变为20。
我的问题是为什么call by value-result
打印15?有人可以给我一个很好的解释,我对value-result
和value
彼此之间的差异以及value-result
如何实际解释感到困惑。
答案 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