Pascal中的“ for i:= 0 to i”循环-为什么有效?

时间:2018-09-21 12:37:12

标签: loops pascal

我很惊讶没有人问这个,因为这是我很久以前注意到的。

显然,在Pascal中,您可以将相同的变量用于循环计数器和多次重复。以下两段代码:

i := 10;
for i:= 0 to i do
begin;
    write(i);
end;

for i:= 0 to 10 do
begin;
    write(i);
end;

似乎是等效的,因为它们都打印012345678910

为什么起作用,为什么不能以其他语言起作用?

1 个答案:

答案 0 :(得分:5)

之所以可行,是因为在Pascal中,循环的最终值仅被评估一次,即i的值是在进入循环时获取的。

换句话说,Pascal代码是就像您完成过的

someHelpVar := i;
for i := 0 to someHelpVar do

而这等效于:

someHelpVar := i;
i := 0;
while i <= someHelpVar do
begin
  ...
  i := i + 1; // or Inc(i);
end;

其他语言,例如C,如果您这样做:

for (i = 0; i <= i; i++)

您没有这样做。最终值会在每次迭代中重新评估,即不仅会评估一次。上面的代码如下:

i = 0;
while (i <= i)
{
    ...
    i++;
}

由于条件始终为真,所以会出现无尽的循环。


因此,总结一下:在Pascal中,最终值仅被评估一次,并存储在一个未命名的临时变量中。 这意味着结束条件不会随着i 改变。在其他语言中,它会在每次迭代中进行重新评估,而不仅是一次。

注意:

做类似

  i := 10;
  for i := 0 to i do

皱眉,因为即使它起作用了,它也会使读者感到困惑。而是使用其他变量作为循环索引:

var
  i, j: Integer;
begin
  i := 10;
  for j := 0 to i do

正如他们所说:“ 总是像最终维护您的代码的人一样,会成为一个暴力的精神病患者,知道您的住所。可读性代码。”资料来源:https://groups.google.com/d/msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ