我理解通过复制恢复调用的基本逻辑。但我想知道像这样的问题
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?
}
答案 0 :(得分:4)
更新:答案是12,请参阅下面的更新。
好的,这实际上是一个很好的问题。因此,这解释了“复制 - 恢复”的全部内容:https://stackoverflow.com/a/8871340/171933
大多数编程语言不支持复制/恢复,只支持传值和传递引用(某些变体)。所以尝试这个并不容易。
然而,您感兴趣的问题是:哪个值获胜? x
在函数结束时(将为11)将其值写回a
,或y
将其值写回a
时功能结束(将是12)。
在支持“复制 - 恢复”的语言中,我希望这会引发编译器错误。
<强>更新强>:
经过一番搜索,我找到了一种实际上支持“复制还原”的语言,即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