Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi中For循环后的循环变量是什么?_Delphi_Variables_For Loop - Fatal编程技术网

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

Delphi中For循环后的循环变量是什么?,delphi,variables,for-loop,Delphi,Variables,For Loop,在Delphi中,考虑 var i: integer; begin for i := 0 to N do begin { Code } end; 有人可能会认为i=N在for循环之后,但是Delphi编译器能保证这一点吗?在Delphiif循环之后,可以假设循环变量等于循环中的最后一个值吗 更新 在尝试了几个简单的循环之后,我怀疑I实际上等于1加上循环后循环中I的最后一个值。。。但是你能相信这一点吗?如果需要在循环之后使用循环索引,我建议使用while循环更清晰:

在Delphi中,考虑

var
  i: integer;

begin

  for i := 0 to N do
  begin
    { Code }
  end;
有人可能会认为
i=N
for
循环之后,但是Delphi编译器能保证这一点吗?在Delphi
if
循环之后,可以假设循环变量等于循环中的最后一个值吗

更新


在尝试了几个简单的循环之后,我怀疑
I
实际上等于1加上循环后循环中
I
的最后一个值。。。但是你能相信这一点吗?

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

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

在<编译器实际上在循环之后使用循环变量时发出警告,因此您应该考虑它未定义。

< P>不,Delphi不保证任何值。在圈外,变量是未定义的——语言指南中的IIRC不无例外地指出了这一点——这意味着较新的编译器实现可以自由地更改变量在循环外部的任何值,这是由于实际的实现。

甚至来自
for
循环的循环变量在循环外部是未定义的

实际上:根据编译器设置和代码复杂度的不同,从变量中得到的内容也会有所不同。我看到代码中的更改将编译器推到了一个不同的优化路径,因此修改了这个未定义变量的值


--jeroen

正如许多人所说,I变量在循环之后应该是未定义的。在实际使用中,它将被定义为“中断”之前的最后一个值,或者如果循环运行到术语,则定义为N+1。但是,这种行为是不可靠的,因为它明确规定了它不起作用

而且,有时候,我甚至不会被指派。我遇到这种行为主要是在打开优化功能的情况下

对于这样的代码

I := 1234;
For I := 0 to List.Count - 1 do
begin
  //some code
end;
//Here, I = 1234 if List.Count = 0

所以。。。如果您想知道循环后I的值,最好在退出循环前将其分配给另一个变量。

永远不要依赖循环后for变量的值

检查编译器输出。Delphi编译器警告您这一点。相信你的编译器

  • 永远不要用{$warnings off}隐藏编译器的提示和警告
  • 学习将信息视为警告,将警告视为错误
  • 优化代码,直到没有任何提示和警告(不违反规则1)

  • 您是否确定N在
    for
    循环之后在范围内?我会先检查这个,因为我怀疑它可能不是。@LBushkin:这取决于N是如何声明的。但是在上面的代码示例中,我只使用N作为循环变量最后一个值的“占位符”。@LBushkin,您可以完全确定
    N
    将在循环之后的范围内,因为它显然在循环之前的范围内(否则代码就不会编译)。Delphi中的作用域不改变mid函数;它开始于函数的开头,结束于函数的结尾。>但是你能相信这个吗?-不,那是一个很好的方法。毕竟,每个for循环都可以以这种方式编写为while循环,但没有任何“编译器魔法”。您可以使用
    Inc(i)
    而不是
    i:=i+1
    ,但IIRC编译器无论如何都会将它们视为相同的。这是正确的。循环完成后,该变量被明确记录为未定义。如果在循环后需要定义的变量,请使用while或repeat,具体取决于循环变量在循环中的使用方式,编译器甚至可以完全消除它,只需使用指针遍历数组的元素,例如。。。。是未定义的。。。除非使用“break”语句终止循环。在这种情况下,定义了值(循环计数器在执行'break'之前的最后一个值)。Gabr是正确的。如果使用
    break
    离开循环,则控制变量的值将有效。同样,如果您使用退出退出退出循环。文件上是这样说的。未记录但仍被普遍接受为真实的是,通过
    raise
    goto
    离开循环也会保留变量的值。如果变量未在循环中使用,编译器可能会生成从N到0计数的代码,即使源代码说从0到N计数,因为这样效率略高。我不知道在这种情况下,变量在循环之后会有什么值。嗯,这可能有点太“严格”。例如,在许多情况下,警告“函数的返回值…可能未定义”是不相关的。编译器很少在不可能的情况下说某些内容可能未定义。我见过的唯一案例涉及两个分配结果的条件,其中一个必须运行。我认为,即使在我知道它们是无害的情况下,也有一些额外的代码来抑制所有的警告。这经常发生,如果你在代码中增加了异常,或者如果你将<代码>退出(返回值)<代码>方法与旧的学校>代码>结果:= 方法。“例如,在许多情况下警告”函数的返回值。。。可能未定义“不相关”-学习初始化该变量。无论如何,这些案例并不多。“我认为,即使在我知道它们是无害的情况下,也有一点额外的代码来抑制所有的警告。”——有一个干净的编译器输出不是很好吗?