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

  • 主题发起人 主题发起人 千中元
  • 开始时间 开始时间

千中元

Unregistered / Unconfirmed
GUEST, unregistred user!
E文帮助又看的含糊,两年前学的标准pascal,没见过这样
的形式:
1)function WF: Integer;
begin
WF := 17;---------???这个函数调用的时候 v:=Wf?
end
如果这样, 直接v:=17不得了??<问题1>
2)function WF: Integer;
begin
Result := 17;-----???和1)有什么区别? <问题2>
end;
3)function Max(A: array of Real
N: Integer): Real;
var
X: Real;
I: Integer;
begin
X := A[0];
for I := 1 to N - 1 do
if X < A then X := A;
Max := X;--------????和1)处有什么区别?(问题3)
end;

4)function MyFunction: Integer;
begin
MyFunction := 5;
Result := Result * 2;
MyFunction := Result + 1;
end
------与全用 myfunction 或者全用result什么区别?(问题4)

5)很长时间没用过函数,给个标准函数吧。
别笑,别笑,我最近受了打击,智障。



 
函数有两种返回赋值 的方法,使用函数名字或者隐含参数Result
 
function Slchuizong(tab:tclientdataset;si:integer;Strgh:string):real;

然后:v:=slchuizong(tabtmp,3,'dddd')
 
1)就是告诉你函数怎么用(呵呵,要不就是知道你的病了)
2)用Result是一种新的技术,建议函数一般用Result来返回
3)对结果赋值,1)不用计算但这里需要先计算
4)用Result好些,MyFunction :=MyFunction + 1形式有些时候后堆栈溢出
5)我觉得着写只是想说明函数的返回可以对Result或自身来附值完成
看帮助或例程吧
 
差不多啊
 
To: 千兄
全贴:我一直用Result
function Slchuizong(tab:tclientdataset;si:integer;Strgh:string):real;
var i_yylc:real;
i_kslc:real;
begin
tab.disableControls
try
i_yylc:=0.0;
i_kslc:=0.0;
if si=4 then
begin
with tab do
begin
first;
while not eof do
begin
if tab.fieldbyname('sjgh').asstring=strgh then
begin
if tab.fieldbyname('yylc').asstring='' then
i_yylc:=i_yylc+0
else
i_yylc:=tab.FieldByName ('yylc').asfloat+i_yylc;
next
end
else
next;
end;
end;
result:=i_yylc;
end
else if si=5 then
begin
with tab do
begin
first;
while not eof do
begin
if tab.fieldbyname('sjgh').asstring=strgh then
begin
if tab.fieldbyname('kslc').asstring='' then
i_kslc:=i_kslc+0
else
i_kslc:=tab.FieldByName ('kslc').asfloat+i_kslc;
next
end
else
next;
end;
result:=i_kslc;
end;
end;
finally
tab.EnableControls
end;
end;
 
别faint,别faint,我最近受了点打击,智障。
cj,等俺病好了要超过你
 
俺以为:函数名 := 某值 这种赋值方式结果实际上就是和 Result := 某值
一样的,不是吗?Result这个方法大概是Object Pascal中特有的吧。
我刚学Delphi时也不习惯用Result呢,现在发现用这个很好,很清晰。
 
>>俺以为:函数名 := 某值 这种赋值方式结果实际上就是和 Result := 某值
>>一样的,不是吗?
我觉得是一样的。

老千,我一上班你就问了一堆 :(
 
打击啊?
/ME 天天受打击:(
 
用Result和直接用函数名字返回区别很大

result可以在函数中作为变量使用,但是函数的名字则不行. 函数名子能用来赋值,不能参与计算
 
不可以:
Temp:=函数名;//这样可会“Stack Overflow"
但可以:
Temp:=Result;//绝没问题,放心用。
 
>result可以在函数中作为变量使用,但是函数的名字则不行. 函数名子能用来赋
值,不能参与计算

对咯,这样的就不能用
function AA:integer;
var t:integer;
begin
aa:=0;
for t:=0 to 9 do
Inc(AA);
end;

 
result 可以在函数内出现在表达式的右边,而函数名不行(左值),即老屯所说
 
result方便递归
 
(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...可以弄明白很多关于语法的疑难问题。
 
老千他肯定知道正确答案,只是想发放军饷吧!
 
高三的时候老师让做基础题,我不听,结果混到个不怎么好的学校。
pilips啊,我觉得真的多学了不少啊。
(object pascal的语法我真不太懂)
 

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
后退
顶部