总是以为对函数名赋值后,函数立即返回,原来不是的,晕!
以前总以为 result 可以多次赋值,运行到函数最后时退出,对函数名赋值后,函数立即退出,今晚捉虫时发现它和result是一样的,都运行到最后才返回,返回值为最后一次赋的那个值,要想提前返回必须加exit。很是晕,出了一身冷汗,想想以前写的都是result + exit返回的,要是直接对函数名赋值还以为它会提前返回,不知会有多少个虫... (高手莫笑,我以前真是这么认为的)
function aaa():integer;
var
i:integer;
begin
aaa := 10;
i := 1000;
aaa := 1000;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
edit1.Text := intTostr(aaa()); // 结果是1000,以前总以为它是10呢。
end;
问题点数:20、回复次数:23Top
1 楼ahjoe(强哥)回复于 2004-12-02 22:15:03 得分 2
我刚学那两年也是这么认为的。 :)Top
2 楼alec_ma(乐无边)回复于 2004-12-02 22:21:33 得分 1
没学过 :DTop
3 楼xzlinux(xz)回复于 2004-12-02 22:32:37 得分 1
你果然是高手啊
竟然会用result + exit这样的语句,
说实话,我是第一次看见,可能是我代码看得太少了吧。
最后想说的是,我也很希望Delphi的编译器会像你说的那样高级一点。Top
4 楼spng(航海士)回复于 2004-12-02 22:41:52 得分 1
upTop
5 楼imacih()回复于 2004-12-02 22:44:16 得分 1
呵呵,不建议对函数名赋值,给RESULT赋值使代码易维护。Top
6 楼CareYouOnly(只在乎你)回复于 2004-12-02 23:01:11 得分 1
我一开始以为result跟函数名一样是立刻返回的(就像C里的return)。Top
7 楼nyf1220(我是党员----不过听说最近风声紧,打算换名字)回复于 2004-12-02 23:11:39 得分 1
哈哈,基础书里都有讲的,Top
8 楼halfdream(哈欠)回复于 2004-12-03 00:34:40 得分 1
PASCAL 一般主张节制使用EXIT..
尽可能让一个函数能够单入单出.
Top
9 楼g961681(技术庸人(情商太低))回复于 2004-12-03 09:23:19 得分 1
用习惯了就可以了!Top
10 楼hellolongbin(一个人(自从扩充话题改版,再也不去灌水乐园了))回复于 2004-12-03 10:21:05 得分 1
俺从来不给函数名赋值的……Top
11 楼caven()回复于 2004-12-03 10:50:26 得分 1
我还不知道函数名可以赋值,我都是用result的 :)Top
12 楼flyforlove(吾将远去)回复于 2004-12-03 10:58:44 得分 1
学C留下的后遗症。Top
13 楼zijida(左八荣,右八耻,代表挂腰间,和谐贴胸前,人挡杀人,佛挡杀佛!)回复于 2004-12-03 12:55:22 得分 1
你看楼主大哥,人家就挺叼
代码写成这样,仍然运行良好
aaa不用声明,不用Result返回
居然能正常跑?! 呵呵,倒~Top
14 楼lemon_wei(研究BT,做好P2P)回复于 2004-12-03 12:57:48 得分 0
回复人: xzlinux(xz) ( ) 信誉:100
你果然是高手啊
竟然会用result + exit这样的语句,
说实话,我是第一次看见,可能是我代码看得太少了吧。
最后想说的是,我也很希望Delphi的编译器会像你说的那样高级一点。
-----------------------------------------------------------------
哈哈,是我没说清楚,我是意思是result exit 这两条语句组合起来用,并不是
说在代码中有 "result + exit "这样的语句。
比如:
if 条件 then
begin
result := 100;
exit;
end;
Top
15 楼ysai(所有真的都是假的真,所有假的都是真的假)回复于 2004-12-03 13:03:56 得分 1
你看楼主大哥,人家就挺叼
代码写成这样,仍然运行良好
aaa不用声明,不用Result返回
居然能正常跑?! 呵呵,倒~
---------------------------
aaa是函数名,当然不用声明
Result变量可能因为编译选项改变而不存在,不用Result返回也正常Top
16 楼lemon_wei(研究BT,做好P2P)回复于 2004-12-03 13:07:35 得分 0
回复人: zijida(深水游鱼,吐泡泡被追殴) ( ) 信誉:99
你看楼主大哥,人家就挺叼
代码写成这样,仍然运行良好
aaa不用声明,不用Result返回
居然能正常跑?! 呵呵,倒~
--------------------------------------------------
1、你新建和工程,把我贴的那段代码加上去,再放个 TEdit 和 TButton ,产生OnClick事件,看看到道能不能运行?难道 TEdit 的 Text 里面显示的不是 1000 吗?
2、本人贴这段代码,只是举个例子,说明一下给函数名赋值后函数并不会返回
Top
17 楼zeroxing(胸无半点墨,腰有万贯财;此般理想高,怎奈做不到!)回复于 2004-12-03 13:19:56 得分 1
楼主你惨了,我看到你以前的一个过程:
function 大王杀不杀: boolean;
begin
if 大王.摇头 then
大王杀不杀 := false;
if 大王.点头 then
大王杀不杀 := true;
end;
begin
if 大王杀不杀 = true then
杀掉无名
else
放了无名;
end;
这下,无名死定了!
看来,以前楼主没有认真测试程序呀,要保证每个分支每个语句至少运行一遍,保证代码覆盖率呀。如果你那么作过,肯定早就发现自己的这个误解了.Top
18 楼zhmnsw(糖醋鼻子)回复于 2004-12-03 13:20:49 得分 1
幸好我习惯用RESULT+EXIT
汗ING。。。Top
19 楼zeroxing(胸无半点墨,腰有万贯财;此般理想高,怎奈做不到!)回复于 2004-12-03 13:21:42 得分 0
错了
你的大王杀不杀应该是这样,上面是我修改过了的版本:
function 大王杀不杀: boolean;
begin
if 大王.摇头 then
大王杀不杀 := false;//以为这里就退出了?
大王杀不杀 := true;
end;
Top
20 楼postfxj(探索者)回复于 2004-12-03 14:23:36 得分 1
什麼習慣了就好了Top
21 楼lemon_wei(研究BT,做好P2P)回复于 2004-12-03 18:09:23 得分 0
回复人: zeroxing(光头) ( ) 信誉:105
“我看到你以前的一个过程“
.
.
.
----------------------------------------
哈哈,代码是要好好测试,"大王杀不杀"这个可不是我写的,你记错了吧。Top
22 楼g961681(技术庸人(情商太低))回复于 2004-12-03 21:07:34 得分 1
用多了,习惯了,就自然不会出错了。
不过还是计较建议使用
Result + Exit模式。Top
23 楼dakk(初学者)回复于 2004-12-03 21:27:37 得分 1
傻瓜了吧
C++是立刻退出,delphi不是Top




