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

问题描述 投票:0回答:7

在德尔福,考虑

var
  i: integer;

begin

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

有人可能会认为

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

更新

在尝试了几个简单的循环之后,我怀疑

i
实际上等于一加上循环内
i
的最后一个值
在循环之后...但是你能相信这个吗?

delphi variables for-loop
7个回答
26
投票

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


7
投票

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


6
投票

如果您需要在循环后使用循环索引,我建议使用

while
循环会更清晰:

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

循环终止后,您知道

i
将是
N + 1
(或更大,如果
N
可能小于零)。


2
投票

甚至有记录

for
循环中的循环变量在循环外未定义。

实践中:您从变量中获得的内容取决于编译器设置和代码复杂性。我看到代码的更改将编译器推入不同的优化路径,因此修改了这个未定义变量的值。

--杰罗恩


1
投票

正如许多人所说, 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 的值,最好在退出循环之前将其分配给另一个变量。


1
投票

永远不要依赖 for 变量的值,在循环之后。

检查编译器输出。 Delphi 编译器会对此发出警告。相信你的编译器。

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

0
投票

正如之前所说,它是未定义的,如果变量在 for 循环之前分配了值,那么它的行为会很有趣。如果使用 Break 退出 for 循环;那么该值在所有情况下都是正确的。

根据我们的经验,在 FreePascal 中,循环变量的值往往是“to”值,但在 embarcadero(以前的 borland)中,该值通常是“to”+ 1。

我想知道为什么 pascal 编译器没有给你关于这个问题的警告,因为它会造成一定的混乱。

© www.soinside.com 2019 - 2024. All rights reserved.