1

我们有三个程序和程序。

在 proc01 中:

output: a=22

在 proc02 中:

output: a=16 b=2 c=5

在 proc03 中:

output: a=5

proc01 和 03 相同。除了我们改了程序参数为什么在proc01的“d”值加了,但是在proc03,没有。

proc02 是另一个示例。未添加“d”值。

为什么????

过程01:

program proc01; 
var
  a,b:integer; 
  procedure test01(var a:integer;b:integer);
  var
    d:integer;
  Begin
    d:=12;
    a:=b+d;
  End; 
Begin
  a:=5;
  b:=10;
  test01(a,b);
  Writeln('a=',a);
  Readln;
End.

过程02:

program proc02;
var
  a,b,c:integer;

procedure test01(var b:integer; a:integer);
var
  d:integer;
Begin
  d:=12;
  a:=b+d;
  b:=a+c;
  c:=c+2;
End;
Begin
     a:=1;
     b:=2;
     c:=3;
     test01(a,b);
     Writeln('a=',a,' b=',b,' c=',c);
     Readln;
End.

过程03:

program proc03;
var
  a,b:integer;

procedure test01(var b:integer;a:integer);
var
  d:integer;
Begin
  d:=12;
  a:=b+d;
End;

Begin
  a:=5;
  b:=10;
  test01(a,b);
  Writeln('a=',a);
  Readln;
End.
4

2 回答 2

4

可能是因为在 proc03 中,您正在为“b”变量传递“a”的值,反之亦然。查看 proc01 和 proc03 中 test01 的签名差异(“a”和“b”顺序不同)。因此,在 proc3 中,您实际上是将“b + d”的结果输入到本地“a”变量中,但输入到程序的“b”变量中,程序的“a”变量不会被修改。因此将 test01 的签名更改为

程序 test01(var a:integer, b: integer)

使其按预期工作。

一般来说,我不建议在此处为程序和过程的变量使用完全相同的名称,以防止出现类似的错误。

亚历克斯

于 2013-12-01T14:50:29.007 回答
2

在 proc 02 和 03中,a参数是按值传递的,而不是通过引用传递的,
所以当你给它分配任何值时,a它只会修改本地副本,不会修改传递的变量

于 2013-12-21T09:10:17.033 回答