特殊情况下复制恢复引起的调用混乱
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;
结果是 12,y
获胜。您可以在浏览器中运行此程序:http://www.compileonline.com/compile_ada_online.php
【讨论】:
以上是关于特殊情况下复制恢复引起的调用混乱的主要内容,如果未能解决你的问题,请参考以下文章
如何在不调用渲染函数的情况下访问 Context 的值? [复制]