麻烦理解通过引用,值和名称传递

时间:2017-05-22 00:45:02

标签: reference pascal

我目前正在尝试理解示例问题中的引用,值和名称传递。

exp = '1 + 1'
x = Function('return ' + exp)()
console.log(x)

给出的代码看起来像我应该显示n,A [1],A [2]的最终值,具体取决于它们的传递方式

procedure practice (x,y,z); interger x,y,z;
begin
y=1;
z=y-x;
end

我认为通过值传递将等同于原始值,因为它们保持不变但另外两个我无法理解发生了什么。

1 个答案:

答案 0 :(得分:4)

procedure practice_by_value(x,y,z : integer);

在传递值中 - x,y,z是与A [1],n,A [2]分开的变量,但是得到相应A [1],n,A中的值的副本[ 2]。因此,由于它们是单独的变量,正如您所说 - 调用者中的变量,如果对x,y或z进行更改,则A [1],n,A [2]不变。

procedure practice_by_reference(var x,y,z : integer);

通过引用传递 - x,y,z成为A [1],n,A [2]的假名或别名。对x,y,z的任何操作都与在A [1],n或A [2]上执行该操作的操作相同。因此,如果您在过程中修改x,y,z,则实际上是在调用者中修改A [1],n,A [2]。

我不熟悉Pascal中的“名字传递”。

var
   A : array[1.. 10] of integer;
   n :integer;

procedure practice_by_value (x,y,z : integer);
begin
   y := 1;
   z := y-x;
end; { practice_by_value }

procedure practice_by_reference(var x,y,z : integer);
begin
   y := 1;
   z := y-x;
end; 

begin
   A[1] := 1;
   A[2] := 2;
   n := 2;
   practice_by_value (A[1], n, A[n]);
   writeln('after pass by value: ',A[1],' ',n,' ',A[2]);
   practice_by_reference(A[1],n,A[n]);
   writeln('after pass by reference : ',A[1],' ',n,' ',A[2]);   
end.

after pass by value: 1 2 2  
after pass by reference: 1 1 0