【问题标题】:Understanding call by value-result and call by reference differnce理解按值结果调用和按引用调用的区别
【发布时间】:2014-08-10 10:34:29
【问题描述】:

所以我有这段 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'打印由空格分隔的数组元素,然后打印一个新行,并且对于一个整数它也只是打印它)

我试图了解如果函数调用是通过值结果或引用,输出会有多么不同。

显然,如果它只是按值,很容易看出该过程不会对实际参数产生任何影响,即输出(按值)应该是:5 10 3 5 10 3。

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

【问题讨论】:

  • 为什么这个标签是 C++ 而不是 Pascal?
  • 对不起,我的错,虽然这并没有什么不同,因为问题的主题与它所用的语言无关。
  • 您包含了代码,因此标签绝对会有所作为。
  • 当你尝试它时会发生什么?如果你这样做,你会清楚地看到不同之处。 (此外,当您发布代码时,该标签是完全相关的。注意您在这里收到的建议通常是个好主意,尤其是当它来自在这里有大量经验的人时。如果您这样做,您会更快地得到答案您根据您发布的代码的语言对其进行标记;熟悉该语言的人会看到它,并且在搜索信息时与本网站的未来读者相关。)
  • 为了说明区别,写你的print函数输出数组内容,去掉循环,按printupdateprint的顺序运行代码,比较输出。

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


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-25
    • 2013-06-29
    • 2021-12-21
    • 2015-05-01
    • 2020-11-15
    • 2013-08-15
    相关资源
    最近更新 更多