gpt4 book ai didi

parameters - 按值/结果调用(又名复制/恢复)

转载 作者:行者123 更新时间:2023-12-02 00:34:29 25 4
gpt4 key购买 nike

我正在阅读我的《编程语言》一书,学习一些有关参数传递的知识,我对按值调用/恢复有疑问。

我理解它在一般情况下是如何工作的,但考虑一下这种情况:

procedure P(x, y, i){
x[i]=y[5-i]
if( i<4 ) P(x, y, i+1)
}

procedure main(){
a=(1, 2, 3, 4, 5)
P(a, a, 0)
}

一旦 P(a, a, 0) 被调用,'a' 的本地副本就会被创建(我们称它们为 a_0 和 a_1)。但是当它返回时,a_0 和 a_1 将具有不同的值。

a_0 = (5, 4, 3, 2, 5)
a_1 = (1, 2, 3, 4, 5)

因此,当它尝试使用新值恢复“a”时……我们发现了两种不同的可能性。这里会发生什么?它会先恢复到 a_0 并被 a_1 覆盖吗? P(a, a, 0) 之后的 'a' 的值是多少?

抱歉标签错误,但我尝试使用“参数”之类的东西,但我还不允许创建新标签。

提前致谢。

最佳答案

在这种情况下,可以通过三种可能的方式来定义语义:

  • 禁止这样的陈述。编译器静态检查并防止这种情况。这可能很难实现,因为参数是通过一系列过程调用传递下来的。

  • 语义是其中一个副本优先于另一个副本。这将通过一个一个地恢复每个参数值来实现。两个引用同一个原始变量的事实意味着该变量有两个副本,后者将成功。

  • 语义是未定义的,每个编译器都可以自由地实现它认为合适的。 C 对于过程参数的评估顺序具有这样的语义。在这种情况下,程序员需要意识到这一点,以避免编写不可移植的代码。

因此实际语义将取决于您正在考虑的语言/编译器组合。另一方面,如果提供了明确的编程语言形式语义(并且已经证明了某些属性,例如它是明确的),那么检查语义是确定程序结果应该是什么的方法.

有趣的问题是 call-by-copy-restore 的形式语义是什么样的。

关于parameters - 按值/结果调用(又名复制/恢复),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5233126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com