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

And*_*and 8 delphi variables for-loop

在Delphi中,考虑一下

var
  i: integer;

begin

  for i := 0 to N do
  begin
    { Code }
  end;
Run Code Online (Sandbox Code Playgroud)

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

更新

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

小智 24

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

  • ...未定义...除非您使用'break'语句终止循环.在这种情况下,定义值(循环计数器在执行'break'之前的最后一个值). (7认同)
  • 那是正确的.在循环完成后,变量具体记录为未定义.如果在循环后需要定义变量,请使用while或repeat (5认同)
  • 根据循环变量在循环中的使用方式,编译器甚至可以完全消除它,并简单地使用指针迭代数组的元素. (3认同)
  • 加布尔是对的.如果你使用`break`离开循环,控制变量的值将是有效的.同样,如果你用`exit`离开循环.文件说明了这一点.未记载但仍被普遍认为是真的,即通过`raise`或`goto`离开循环也将保留变量的值. (3认同)

Gie*_*iel 7

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


Gre*_*ill 6

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

i := 0;
while i <= N
begin
    { Code }
    i := i + 1;
end;
Run Code Online (Sandbox Code Playgroud)

之后循环终止,你知道i将是N + 1(或更高,如果N大于零本来可以更小).

  • 您可以使用`Inc(i)`而不是`i:= i + 1`,但IIRC编译器无论如何都会对它们进行相同处理. (2认同)