В Delphi параметры оцениваются по порядку при передаче в метод?

Является ли порядок, в котором вычисляются параметры до того, как процедура вызывается в Delphi?

IOW, если у меня есть этот уродливый код (нашел что-то вроде этого в устаревшем приложении)...

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

Test(A(err), err);

... Тест гарантированно получает параметры (17, 42) или может быть также (17, undefined)?


Edit:

Хотя пример Дэвида возвращает другой результат с 32-битным и 64-битным компилятором, это (к счастью) не влияет на мой старый код, потому что Test (A (err), err) хранит только адрес "err" в и не имеет значения, выполняет ли этот компилятор перед вызовом A (err) или после.

Ответы

Ответ 1

Порядок оценки параметров в 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.

Ответ 2

Отредактировано: кажется, что компилятор может нарушить поведение, описанное в справке:

Из Справочная информация о вызовах (основное внимание):

Контуры регистров и паскалей передают параметры слева направо; то есть самый левый параметр оценивается и передается первым, а самый правый параметр оценивается и передается последним.