在Delphi中,考虑
var
i: integer;
begin
for i := 0 to N do
begin
{ Code }
end;
有人可能认为i = N
循环之后for
,但Delphi编译器是否保证这一点?在Delphi if
循环之后,可以假设循环变量等于循环内的最后一个值吗?
更新
在尝试了几个简单的循环后,我怀疑i
实际上等于一个加上循环后循环中<{1}}的最后一个值 ...但是你能依靠这个吗?
答案 0 :(得分:24)
不,德尔福不保证任何价值。在循环之外,变量是未定义的 - 而语言指南IIRC明确指出 - 这意味着较新的编译器实现可以自由地改变变量在循环外可能具有的任何值,因为实际的实现。
答案 1 :(得分:7)
如果在循环之后使用循环变量,编译器实际会发出警告,因此您应该将其视为未定义。
答案 2 :(得分:6)
如果你需要在循环后使用循环索引,我建议使用while
循环更清楚:
i := 0;
while i <= N
begin
{ Code }
i := i + 1;
end;
在该循环终止后,您知道 i
将N + 1
(或更高,如果N
可能小于零)。
答案 3 :(得分:2)
甚至documented来自for
循环的循环变量在循环外部未定义。
实际上:从变量中获得的内容因编译器设置和代码复杂性而异。我已经看到代码中的更改将编译器推送到不同的优化路径,因此修改了此未定义变量的值。
- 的Jeroen
答案 4 :(得分:1)
正如许多人所说的,在循环之后,I变量应该是未定义的。在实际使用中,它将被定义为“中断”之前的最后一个值,如果循环运行到term,则定义为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的值,最好在离开循环之前将它分配给另一个变量。
答案 5 :(得分:1)
在循环之后,永远不要依赖于for变量的值。
检查编译器输出。 Delphi编译器会向您发出警告。相信你的编译器。