按值传递和按名称传递的输出

Output for pass-by-value and pass-by-name

提问人:KNuz 提问时间:11/13/2016 更新时间:11/14/2016 访问量:150

问:

当 x 和 y 按值传递以及按名称传递时,我需要找到以下代码的结果。

PROGRAM EX1; 
int i; //global
int A[3]; //global

    PROCEDURE P1(int x, int y)
    Begin
        y:=2; 
        PRINT(x); 
        i:=3; 
        PRINT(x); 
        i:=3; 
        PRINT(x); 
        PRINT(y); 
    End; 
BEGIN //main
    A[1]:=7; A[2]:=13; A[3]:=11; 
    i:=1; 
    P1(A[i],i); //first call
    P1(i,A[i]); //second call
END.

以下是我得出的结论,如果 x 和 y 是按值传递的: 输出: 13, 11, 11, 3 第二输出:1、3、3、11。 如果这是错误的,请帮助我理解为什么。

从我看到的示例来看,我也不确定按名称传递在此代码中如何工作。也请帮忙。

假设是静态范围。

参数 参数 泛型编程 传递值 名称

评论

0赞 FDavidov 11/13/2016
你有没有试过谷歌一下,这就是参数传递方法的含义?此外,您不能有时以一种方式将参数传递给函数/过程,有时以另一种方式传递参数。函数/过程声明确定了将要使用的方法。最后,如果按值传递,则一旦过程/函数完成,对过程/函数中其值的任何更改都将丢失。
0赞 KNuz 11/13/2016
这只是理论上的,如果代码使用不同的参数传递运行,它会输出什么。是的,我已经用谷歌搜索了,并有一本关于不同传球方法的教科书,但我需要更多的指导来帮助我理解。

答:

0赞 FDavidov 11/14/2016 #1

在描述中,我将忽略您的代码很可能无法编译/运行的事实,并且只会解决您的特定问题。

无论用于传递参数的机制如何(按值或按名称),对变量的赋值都是没有意义的:当按值传递时,源参数可能是数组这一事实根本没有意义(在函数中);当按名称传递并且您传递 where 时,到达函数主体的内容是,因此更改为根本没有影响。iP1A[i]i=1P1A[1]i

因此,在这两种情况下(按值和名称),您将得到相同的结果,这意味着:第一次调用为 7,7,7,2,第二次调用为 1,1,1,2。