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

Parameters 按值传递和按名称传递的输出,parameters,parameter-passing,generic-programming,pass-by-value,pass-by-name,Parameters,Parameter Passing,Generic Programming,Pass By Value,Pass By Name,我需要在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;

我需要在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。 如果这是错误的,请帮助我理解原因

从我所看到的示例中,我也不确定pass-by-name在这段代码中是如何工作的。也请帮帮忙


假设静态作用域

在描述过程中,我将忽略这样一个事实,即您的代码很可能无法编译/运行,并且只解决您的特定问题

不管用于传递参数的机制是什么(按值还是按名称),变量
i
的赋值都是无意义的:当按值传递时,根本没有意义(在函数
P1
中)源参数可能是数组的事实;当按名称传递并且传递
A[i]
其中
i=1
时,到达函数体
P1
的是
A[1]
,因此对
i
的更改将完全无效


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

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