在德尔福,考虑
var
i: integer;
begin
for i := 0 to N do
begin
{ Code }
end;
有人可能会认为
i = N
在 for
循环之后,但是 Delphi 编译器能保证这一点吗?在 Delphi if
循环之后,可以假设循环变量等于循环内的最后一个值吗?
更新
在尝试了几个简单的循环之后,我怀疑
i
实际上等于一加上循环内i
的最后一个值在循环之后...但是你能相信这个吗?
不,德尔福不保证任何价值。在循环之外,变量是未定义的 - IIRC 语言指南明确指出了这一点 - 这意味着较新的编译器实现可以自由更改变量在循环之外由于实际实现而可能具有的任何值。
如果您在循环后使用循环变量,编译器实际上会发出警告,因此您应该将其视为未定义。
如果您需要在循环后使用循环索引,我建议使用
while
循环会更清晰:
i := 0;
while i <= N
begin
{ Code }
i := i + 1;
end;
循环终止后,您知道
i
将是N + 1
(或更大,如果N
可能小于零)。
正如许多人所说, I 变量在循环后应该是未定义的。在实际使用中,它将被定义为“中断”之前的最后一个值,或者如果循环运行到终止,则定义为 N + 1。但这种行为不能依赖,因为它明确指定它并不意味着起作用。
此外,有时,I甚至不会被分配。 我遇到这种行为主要是在打开优化的情况下。
对于这样的代码
I := 1234;
For I := 0 to List.Count - 1 do
begin
//some code
end;
//Here, I = 1234 if List.Count = 0
所以...如果你想知道循环后 I 的值,最好在退出循环之前将其分配给另一个变量。
永远不要依赖 for 变量的值,在循环之后。
检查编译器输出。 Delphi 编译器会对此发出警告。相信你的编译器。
正如之前所说,它是未定义的,如果变量在 for 循环之前分配了值,那么它的行为会很有趣。如果使用 Break 退出 for 循环;那么该值在所有情况下都是正确的。
根据我们的经验,在 FreePascal 中,循环变量的值往往是“to”值,但在 embarcadero(以前的 borland)中,该值通常是“to”+ 1。
我想知道为什么 pascal 编译器没有给你关于这个问题的警告,因为它会造成一定的混乱。