在特殊情况下,通过复制恢复调用时出现混乱



我了解通过复制还原调用的基本逻辑。但我想知道像这样的问题

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;

结果是12y获胜。您可以在浏览器中运行此程序:http://www.compileonline.com/compile_ada_online.php

最新更新