我了解通过复制还原调用的基本逻辑。但我想知道像这样的问题
void p(int x,int y) {
x++;
y+=2;
}
main() {
int a=10;
p(a,a);
// what will be now value of a, 11 or 12?
}
更新:答案是12,请参阅下面的更新。
好吧,这其实是个好问题。因此,这就解释了"拷贝恢复"的意义:https://stackoverflow.com/a/8871340/171933
大多数编程语言不支持复制/恢复,而只支持按值传递和按引用传递的(一些变体)。所以尝试这个并不容易。
然而,你感兴趣的问题是:哪种价值观获胜?当函数结束时(应该是11),x
是否可以将其值写回a
,或者当函数结束(应该是12)时,y
是否可以将它的值写回到a
。
在支持"复制还原"的语言中,我希望这会引发编译器错误。
更新:
经过一番搜索,我发现了一种真正支持"复制还原"的语言,即Ada。这是Ada中的代码(这是我用Ada编写的第一个程序,可能也是最后一个程序):
with Ada.Text_IO; use Ada.Text_IO;
procedure copy_restore_example is
a: integer;
procedure p(x: in out integer; y: in out integer) is
begin
x:= x+1;
y:= y+2;
end p;
begin
a := 10;
Put_Line("Before :" & natural'image(a));
p(a, a);
Put_Line("After :" & natural'image(a));
end copy_restore_example;
结果是12,y
获胜。您可以在浏览器中运行此程序:http://www.compileonline.com/compile_ada_online.php