0

所以我有这片帕斯卡代码:了解呼叫由值-结果和呼叫参考differnce

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. 

(假设“打印”打印由空格分隔阵列的元件,并且然后显示新的线也是一个整数,它只是打印它)

而且我想了解如果函数调用是通过值结果还是通过引用输出会有多不同。很明显,如果它只是按值,很容易判断该过程对实际参数没有任何影响,即输出(按值)应该是:5 10 3 5 10 3。

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

+0

为什么标记为C++而不是Pascal? –

+0

对不起,我的坏,虽然它并没有真正有所作为,因为这个问题的主题与它所写的语言无关。 –

+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;