加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi:函数结果在for循环期间没有清空

发布时间:2020-12-15 10:12:22 所属栏目:大数据 来源:网络整理
导读:这是正常的吗? for a := 1 to 10 do x.test; x.test; x.test; x.test;function test: string;begin {$IFDEF DEBUG} DebugMessage('result check = '+Result,3); {$ENDIF} result := result + 'a';end;10:39:59: result check = 10:39:59: result check = a1
这是正常的吗?
for a := 1 to 10 do
    x.test;

   x.test;
   x.test;
   x.test;

function test: string;
begin
  {$IFDEF DEBUG}  DebugMessage('result check = '+Result,3); {$ENDIF}
   result := result + 'a';
end;

10:39:59: result check = 
10:39:59: result check = a
10:39:59: result check = aa
10:39:59: result check = aaa
10:39:59: result check = aaaa
10:39:59: result check = aaaaa
10:39:59: result check = aaaaaa
10:39:59: result check = aaaaaaa
10:39:59: result check = aaaaaaaa
10:39:59: result check = aaaaaaaaa

10:39:59: result check = 
10:39:59: result check = 
10:39:59: result check =

在for循环期间,函数结果堆栈没有被释放? :o

解决方法

结果被视为函数的隐式var参数.

想象一下,如果你用这种方式明确地写出来:

procedure test(var result: string);
begin
  result := result + 'a';
end;

for i := 1 to 10 do
  test(s);

然后你会期望它附加到s.

每次调用时都丢弃Result的事实是编译器有时决定最终确定它的原因.正如@gabr指出的那样,它选择在循环内部作为优化时不完成此隐式变量.

如果您每次调用test时都将测试结果分配给一个字符串,那么每次都会看到字符串变长,它永远不会被重新初始化.

这就是您应该始终初始化结果变量的原因.它看起来像一个局部变量,但最好将其视为var参数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读