在Delphi中,是传入方法时按顺序评估的参数? [英] In Delphi, are parameters evaluated in order when passed into a method?

查看:150
本文介绍了在Delphi中,是传入方法时按顺序评估的参数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆