理解按值 - 结果调用和按引用差异调用

时间:2014-06-19 18:50:38

标签: parameter-passing pass-by-reference pascal semantics pass-by-const-reference

所以我有这段Pascal代码:

program P;

var a: array [1..2] of Integer;
var i :Integer;
var k :Integer;

procedure update(x,y,z: Integer);
    begin
        x := x+1;
        y := x*2;
        x := y;    
        k := x;
     end


begin
     a[1] := 5; a[2] := 10;
     k := 3;
     for i:=1 to 2 do
       begin
          update(a[i],a[2],k);
          print(a);
          print(k)
       end
end.

(假设' print'打印以空格分隔的数组元素,然后打印一个新行,也打印一个整数,只打印它)

我试图了解函数调用是通过value-result还是通过引用输出的不同。

显然,如果只是按值,很容易判断程序对实际参数没有任何影响,即输出(按值)应为:5 10 3 5 10 3。

我认为,如果它是价值结果,它至少会是第一次迭代:12 12 12。 在引用的情况下,我感到困惑。 会是什么?

1 个答案:

答案 0 :(得分:1)

您尚未声明任何变量参数。变量K将被更改,但在此上下文中不会计算,通常被视为不良做法。

PROGRAM ParamTest;

VAR
   A, B : Integer;

PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer);

BEGIN
   X := X + Z;
   Y := Y + Z;
END;

BEGIN
   A := 10;
   B := 10;
   TestProc(A, B, 5);
   WriteLn(A, ' ', B);
END.
  • X:按值调用
  • Y:按参考号召
  • Z:通过常数调用

该程序的输出应为10 15

Z声明为常量参数后,您向编译器保证不会更改该值。以下过程变体应在编译时出错。

PROCEDURE TestProc(X : Integer; VAR Y : Integer; CONST Z : Integer);

BEGIN
   X := X + Z;
   Y := Y + Z;
   Z := Z + 1;
END;