14

プロシージャが呼び出される前にパラメータが計算される順序は Delphi で定義されていますか?

IOW、もし私がこの醜いコードを持っているなら(レガシーアプリケーションでこのようなものを見つけました)...

function A(var err: integer): integer;
begin
  err := 42;
  Result := 17;
end;

Test(A(err), err);

... Test はパラメーター (17、42) を受け取ることが保証されていますか、それとも (17、未定義) でしょうか?


編集:

David の例は 32 ビット コンパイラと 64 ビット コンパイラで異なる結果を返しますが、Test(A(err), err)は 'err' のアドレスのみをレジスタに格納し、コンパイラが A(err) を呼び出す前か後にこれを行うかどうかは関係ありません。

4

2 に答える 2

12

Delphi でのパラメータ評価の順序は定義されていません。

これの興味深いデモンストレーションとして、次のプログラムは、32 ビット コードと 64 ビット コードのどちらをターゲットにするかによって出力が異なります。

program ParameterEvaluationOrder;

{$APPTYPE CONSOLE}

uses
  SysUtils;

function SideEffect(A: Integer): Integer;
begin
  Writeln(A);
  Result := A;
end;

procedure Test(A, B: Integer);
begin
end;

begin
  Test(SideEffect(1), SideEffect(2));
  Readln;
end.
于 2012-06-13T08:11:46.070 に答える
5

編集済み: コンパイラがヘルプに記載されている動作に違反している可能性があります:

呼び出し規約のヘルプトピック(強調私のもの)から:

レジスタとパスカルの規則は、パラメータを左から右に渡します。つまり、左端のパラメーターが最初に評価されて渡され、右端のパラメーターが評価されて最後に渡されます。

于 2012-06-13T08:06:45.893 に答える