在Delphi中,参数是否在传递给方法时按顺序进行评估?

gab*_*abr 14 delphi

在Delphi中定义的过程调用之前,是否计算参数的顺序?

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

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

Test(A(err), err);
Run Code Online (Sandbox Code Playgroud)

...测试保证接收参数(17,42)还是(17,未定义)?


编辑:

虽然David的示例在32位和64位编译器中返回不同的结果,但这(幸运的是)不会影响我的遗留代码,因为Test(A(错误),错误)只在寄存器中存储'err' 的地址无论编译器在调用A(错误)之前还是之后执行此操作都无关紧要.

Dav*_*nan 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.
Run Code Online (Sandbox Code Playgroud)

  • @RudyVelthuis据我所知,调用约定指定*传递*的顺序但不指定*evaluation*的顺序.所以我对此评论提出质疑. (4认同)

MBo*_*MBo 5

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

来自呼叫约定帮助主题(强调我的):

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