14

在 Delphi 中定义了调用过程之前计算参数的顺序吗?

IOW,如果我有这个丑陋的代码(在遗留应用程序中找到类似的东西)......

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

Test(A(err), err);

... Test 是否保证接收参数 (17, 42) 或者它也可以是 (17, undefined)?


编辑:

尽管 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

编辑: 似乎编译器可能违反帮助中描述的行为:

调用约定帮助主题(强调我的):

register 和 pascal 约定从左到右传递参数;也就是说,最左边的参数首先被评估和传递,最右边的参数最后被评估和传递。

于 2012-06-13T08:06:45.893 回答