gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:05:00 25 4
gpt4 key购买 nike

这正常吗?

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

最佳答案

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 参数。

关于Delphi:for循环期间函数结果未清空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5102843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com