Delphi中For循环后的循环变量是什么?

时间:2010-04-09 21:01:49

标签: delphi variables for-loop

在Delphi中,考虑

var
  i: integer;

begin

  for i := 0 to N do
  begin
    { Code }
  end;

有人可能认为i = N循环之后for,但Delphi编译器是否保证这一点?在Delphi if循环之后,可以假设循环变量等于循环内的最后一个值吗?

更新

在尝试了几个简单的循环后,我怀疑i实际上等于一个加上循环后循环中<{1}}的最后一个值 ...但是你能依靠这个吗?

6 个答案:

答案 0 :(得分:24)

不,德尔福不保证任何价值。在循环之外,变量是未定义的 - 而语言指南IIRC明确指出 - 这意味着较新的编译器实现可以自由地改变变量在循环外可能具有的任何值,因为实际的实现。

答案 1 :(得分:7)

如果在循环之后使用循环变量,编译器实际会发出警告,因此您应该将其视为未定义。

答案 2 :(得分:6)

如果你需要在循环后使用循环索引,我建议使用while循环更清楚:

i := 0;
while i <= N
begin
    { Code }
    i := i + 1;
end;

在该循环终止后,您知道 iN + 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编译器会向您发出警告。相信你的编译器。

  1. 永远不要使用{$ Warnings off}隐藏编译器的提示和警告!
  2. 学会将信息视为警告,将警告视为错误!
  3. 优化代码,直到您收到ZERO提示和警告(不违反规则1)。