敏
敏哥
Unregistered / Unconfirmed
GUEST, unregistred user!
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...可以弄明白很多关于语法的疑难问题。
(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...可以弄明白很多关于语法的疑难问题。