Delphi:for循环期间函数结果未清空

Posted

技术标签:

【中文标题】Delphi:for循环期间函数结果未清空【英文标题】:Delphi: function Result not emptied during for loop 【发布时间】:2011-07-03 10:28:27 【问题描述】:

这正常吗?

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

【问题讨论】:

这在 SO 之前已经处理过了。 【参考方案1】:

Result 被视为函数的隐式 var 参数。

想象一下,如果你这样明确地写出来:

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

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

那么你会期望它附加到s

您每次调用它时都会丢弃Result,这就是编译器有时决定最终确定它的原因。正如@gabr 指出的那样,作为优化,它选择在循环内不最终确定这个隐式变量。

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

这就是为什么你应该总是初始化你的结果变量。它看起来像一个局部变量,但最好将其视为var 参数。

【讨论】:

+1 为示例,但请将您对我现在已删除的答案所做的评论包含在您的答案中 (if you assign the result to something outside of the function, then the initialization will happen once and once only) @Cosmin 那已经存在了,但我现在把它作为一个新段落(倒数第二个)突出显示 @DavidHeffernan,很好的答案!今天我在动态数组中遇到了类似的问题,很容易解决,但这帮助我真正理解了。【参考方案2】:

嗯,你应该总是初始化函数结果。不要仅仅因为它是动态(在本例中为字符串)类型就认为它会被设置为适当的值。

【讨论】:

然后编译器应该发出“未初始化”警告,就像非生命周期管理的类型一样。

以上是关于Delphi:for循环期间函数结果未清空的主要内容,如果未能解决你的问题,请参考以下文章

制作循环链表并找到循环的开头

无限循环计算阶乘问题

for 循环期间的动态分配会造成内存泄漏吗?

for循环子命令中的bash变量扩展[重复]

Python语言程序设计之一--for循环中累加变量是否要清零

Delphi,在for循环中随时更改循环次数