特殊情况下复制恢复引起的调用混乱

Posted

技术标签:

【中文标题】特殊情况下复制恢复引起的调用混乱【英文标题】:Confusion in call by copy-restore in a special case 【发布时间】:2013-12-20 15:16:47 【问题描述】:

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

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?

【问题讨论】:

你试过运行这个吗?这应该是C还是其他?在 C 中,a 的值将是 10(假设 =++ 本来是 ++),但我不确定我是否清楚你在问什么。特别是,x=++ 的意图是什么? x++? 这是什么语言?似乎代码也无法编译。 "x=++" ? 这里我不是在说任何语言,我只是在询问通过复制还原方法调用。 也许您需要解释一下这种“复制恢复方法”,以及您在哪里听说过它。它不是 C 或 C++ 语言中的东西,它们具有按值调用和按引用调用。也许这是您在谈论的另一种语言(尽管发布的代码似乎至少是 C 的近似值)? @alienCoder 我想你已经得到了答案。 【参考方案1】:

更新:答案是 12,请参阅下面的更新。

好的,这实际上是一个好问题。所以这解释了“复制恢复”的全部含义:https://***.com/a/8871340/171933

大多数编程语言不支持复制/恢复,而仅支持(某些变体)按值传递和按引用传递。所以要尝试这个并不容易。

但是,您感兴趣的问题是:哪个值获胜? x 是否在函数结束时将其值写回 a(即 11),或者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;

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

【讨论】:

以上是关于特殊情况下复制恢复引起的调用混乱的主要内容,如果未能解决你的问题,请参考以下文章

NFC问题分析之死锁引起的ANR

在哪些情况下调用 C++ 复制构造函数?

如何在不调用渲染函数的情况下访问 Context 的值? [复制]

Onmouseover被调用多次

在这种情况下,如何从 API 调用中控制台记录数据? [复制]

如何在不隐式调用“复制”的情况下初始化 CUDA 推力向量?