gpt4 book ai didi

pass-by-reference - 按引用调用和按值调用结果

转载 作者:行者123 更新时间:2023-12-02 17:31:23 25 4
gpt4 key购买 nike

好吧,我和我的 friend 就下面的代码进行了辩论。我们对它产生的输出有点困惑。有人可以澄清下面这段代码的按引用调用和按值调用结果吗?

program params;
var i: integer;
a: array[1..2] of integer;

procedure p(x,y: integer);
begin
x := x + 1;
i := i + 1;
y := y + 1;
end;

begin
a[1] := 1;
a[2] := 2;
i := 1;
p( a[i],a[i] );
output( a[1],a[2] );
end.

这个程序的输出结果是参数通过值-结果和引用传递给过程p。

最佳答案

按值(value)调用

p 中的

xy 是使用实际参数初始化 的局部变量,而i 是一个全局变量,所以调用 p( a[i],a[i] ) 等价于:

x := 1  /* The value of a[i] */
y := 1 /* The value of a[i] */

x := 2 /* x + 1 */
i := 2 /* i + 1 */
y := 2 /* y + 1 */

最后打印值 1、2,因为它们是未更改的 a[1]a[2] 的值。

引用调用

p 中的 xy 都是 a[1] 和(再次) 的别名>a[1](因为调用过程时 i = 1),所以调用等同于:

a[1] := 2  /* a[1] + 1 */
i := 2 /* i + 1 */
a[1] := 3 /* a[1] + 1 */

最后打印值 3、2。

以名字呼唤

当简单变量作为参数传递时,按名称调用等同于按引用调用,但当您传递表示内存位置的表达式时,不同下标。在这种情况下,每次遇到实际参数时都会重新评估。所以在这种情况下,这是 p( a[i],a[i] ) 调用的效果:

a[1] := 2  /* since i = 1, the result is equal to a[1] + 1 */
i := 2 /* i + 1 */
a[2] := 3 /* since i is now 2, the result is equal to a[2] + 1 */

最后打印值 2、3。在实践中,实现调用一个匿名函数(一个“thunk”),每次它必须评估一个参数。

按值结果调用

为了完成讨论,这里是值-结果参数传递的情况,其中 xy 在过程执行开始时用实际参数的值,并且在过程执行结束时,被复制回原始变量地址:

x := 1       /* The value of a[i] */
y := 1 /* The value of a[i] */

x := 2 /* x + 1 */
i := 2 /* i + 1 */
y := 2 /* y + 1 */

a[1] := 2 /* the value of x is copied back to a[1] */
a[1] := 2 /* the value of y is copied back to a[1] (not a[2]!) */

最后打印值 2, 2。

有关传递参数的不同方式的讨论,请参见例如 this .

关于pass-by-reference - 按引用调用和按值调用结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32794008/

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