1

手順のある3つのプログラムがあります。

proc01:

output: a=22

proc02:

output: a=16 b=2 c=5

proc03:

output: a=5

proc01 と 03 は同じです。プロシージャ パラメータを変更したことを除いて、なぜ proc01 では "d" 値が追加されましたが、proc03 では追加されませんでした。

proc02 は別の例です。「d」値は追加されません。

どうして????

proc01:

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.

proc02:

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.

proc03:

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 に答える