在特殊情况下通过复制还原来调用混淆

时间:2013-12-20 15:16:48

标签: function-calls

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

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?
}

1 个答案:

答案 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