В 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
Отредактировано:
кажется, что компилятор может нарушить поведение, описанное в справке:
Из Справочная информация о вызовах (основное внимание):
Контуры регистров и паскалей передают параметры слева направо; то есть самый левый параметр оценивается и передается первым, а самый правый параметр оценивается и передается последним.