在Delphi中,是传入方法时按顺序评估的参数? [英] In Delphi, are parameters evaluated in order when passed into a method?
问题描述
IOW,如果我有这个丑陋的代码(在这里找到一个这样的东西)遗留应用程序)...
函数A(var err:integer):integer;
begin
err:= 42;
结果:= 17;
结束
测试(A(err),err);
...是测试保证接收参数(17,42),或者也可以是(17 ,未定义)?
编辑:
尽管大卫的例子使用32位和64位编译器返回不同的结果,这个(幸运的是)不会影响我的遗留代码,因为Test(A(err),err)只将'err'的地址存储在寄存器,编译器在调用A(err)或之后是否执行此操作并不重要。
Delphi中的参数评估没有定义。
作为一个有趣的演示,以下程序有不同的输出,取决于您是否定位32位或64位代码:
程序ParameterEvaluationOrder;
{$ APPTYPE CONSOLE}
使用
SysUtils;
函数SideEffect(A:Integer):整数;
begin
Writeln(A);
结果:= A;
结束
程序测试(A,B:整数);
begin
end;
begin
测试(SideEffect(1),SideEffect(2));
Readln;
结束。
Is the order in which parameters are calculated before a procedure is called defined in Delphi?
IOW, if I have this ugly code (found something like this in a legacy application) ...
function A(var err: integer): integer;
begin
err := 42;
Result := 17;
end;
Test(A(err), err);
... is Test guaranteed to receive parameters (17, 42) or could it also be (17, undefined)?
Edit:
Although David's example returns different result with 32-bit and 64-bit compiler, this (luckily) doesn't affect my legacy code because Test(A(err), err) only stores an address of 'err' in the register and it doesn't matter whether the compiler does this before calling A(err) or after.
The order of parameter evaluation in Delphi is not defined.
As an interesting demonstration of this, the following program has different output depending on whether you target 32 or 64 bit code:
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.
这篇关于在Delphi中,是传入方法时按顺序评估的参数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!