是DELPHI的优化技术还是BUG?

AWolfBoy 2004-03-16 10:22:02
前二天在调试程序时无意发现(其实以前也碰到过,只是没有留心),DELPHI程序既然有这么一个秘密.程序如下

function testfunc : string;
begin
result := result + 'a';
end;

procedure testCall;
var
i : integer;
tmp : string;
begin
for i := 0 to 3 do
begin
if i > 0 then
tmp := tmp + ','
tmp := tmp + testFunc;
end;
ShowMessage(tmp);
end;

大家能猜得出tmp的结果是多少么,我想很多人看程序都会以为是'a,a,a,a',这样就大错特错了,结果是'a,aa,aaa,aaaa'.
原来DELPHI这家伙自做聪明,RESULT这东西并没有每次重新初始化(我猜想可能是一个指针地址),大家说说这到底是DELPHI的优化技术还是BUG?
...全文
60 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
AWolfBoy 2004-03-20
  • 打赏
  • 举报
回复
当然我是不会写出如下这样的代码了:
function testfunc : string;
begin
result := result + 'a';
end;
这只是为了说明方便,实质上我的程序是有些判断的,然后有那么一句。

我觉得这不只是Delphi总是要求result初始化的,而且对于很多其实变量也是有这种情况,例如整形变量,好像如果没有初始化就不是0.

不过我始终觉得RESULT可能就是一个指针,并不是在函数一调用就释放的,而是在调用这个函数的过程(函数)使用完后才释放,所以生存周期比较长。
alphax 2004-03-16
  • 打赏
  • 举报
回复
是我们对生存期自管理类型的result变量认识的bug,不是delphi的bug
alphax 2004-03-16
  • 打赏
  • 举报
回复
我看了一下帮助,这个问题也不能全算bug

因为Delphi总是要求result初始化的,
就象局部变量一样,如果result没有初始化,它的值是没有定义的,

对于生存期自管理类型的局部变量,它们通常初始化为'',nil或NULL,
但是Result变量和局部变量不同,它的生存期比函数要长,
它在进入函数前已经初始化,函数退出时,它的值仍然被使用

所以对于Result变量,使用前必须初始化
Result := '';

天啊,我有很多代码依赖于Result变量初始化为''!
alphax 2004-03-16
  • 打赏
  • 举报
回复
不过你应该不会写

function testfunc : string;
begin
result := result + 'a';
end;

这样的代码吧!

这样的代码没有意义,因为Result := 'a';就可以完成了

你是怎样实际遇到这个bug的?让我也注意一下避免
AWolfBoy 2004-03-16
  • 打赏
  • 举报
回复
TO: forgetter(csdn第一人渣)

人渣就是人渣,不过和你这种人斗嘴只会污辱我.
forgetter 2004-03-16
  • 打赏
  • 举报
回复
SB,你用其它语言看看,你这种SB不要侮辱了Delphi
alphax 2004-03-16
  • 打赏
  • 举报
回复
真的是bug

828

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧