突然不知道自己到底学过delphi没有:result和函数(100分)

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间
sorry,刚才忘了换行。

(1).函数值一般是用EAX返回的,如有序类型、指针、长串;实型数据返回在协处理器的寄存器堆ST(0)内。
对函数名赋值一般就是对EAX赋值,即产生汇编码:mov eax,op2 。

(2).Result可看成是每个函数都具有的局部变量,它似乎在System单元申明,实际上是编译器内建的一个
临时变量,可能是EAX或EDX或ECX或[SP]。Result与普通局部变量的区别是:函数返回时,Result的值将被
复制到EAX,而且编译器可以对Result的相关代码进行有效的优化。直接对Result或函数名赋值且“:=”右
边无Result或函数名的语句,只有最迟出现的被保留,其它的被编译器优化掉了。

(3).Object Pascal的语法规定:,当且仅当一个过程类型的变量单独出现在“:=”左边时,“:=”右边的
表达式被编译器解释为过程类型的常值表达式,表达式中的过程类型变量或函数/过程名此时表示函数/过程
的入口地址。其它情况下(没有@时),过程类型变量或函数/过程名一律被编译器解释为对函数/过程的调用。
下面给出一个毫无实用价值的函数,只为说明语法。

function ForTest:integer;
var
pf:function:integer;
begin

ForTest:=1
//此句被忽略,不产生任何代码

Result:=2
//此句被忽略,不产生任何代码

ForTest:=3;

ForTest:=Result+1
//执行此句后,Result=4

pf:=ForTest
if @pf=nil then;//执行此句后,pf指向ForTest函数入口地址

ForTest:=ForTest+Result
//递归调用,必然导致堆栈溢出

end;


(4).综上所述:返回结果用Result或函数名都可以(我用函数名);若返回值需要参与运算就只能用普通变量
和Result,应优先选用Result。


(5).我常常怀疑Object Pascal的语法是边调试Delphi源码、边对照标准C、边修改出来的。编个简单的测试
程序,设好断点,按键F9,Ctrl+Alt+C,F8/F7...thinking...可以弄明白很多关于语法的疑难问题。
 
函数中对Result赋值和对函数名赋值是不同的,正如前面几位所说的,
这里我加一点:
例子:
1)function WF: Integer;
begin
WF := 17;

other code;

end

2)function WF: Integer;
begin

Result := 17;

other code;

end;
对函数名赋值后,函数返回,即第一个函数中的other code永远不能执行,
对Result赋值后,函数并不马上返回,即第二个函数中的other code能执行...
 
我看着都一样,
原来是必须用函数名的,现在都行,推荐 result.
 
To Kent:
你的说法是错误的,为什么不上机验证你给出的例子?
To SuperMMX:
函数名和Result是不同的,在我给出的函数中,函数名=EAX,Result=EBX。这
两者的使用并不好坏之分,应根据具体情况灵活选用。
 
to 敏哥:
你的例子是上面的吗?
我的意思是最后的函数返回值。
 
函数中如果函数名在表达式右边,此函数会被再次调用,result不会.
在表达式左边,函数名和result是一样的.
就是如此而已.
 
敏哥说的很对!!

kang 不对。
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部