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

"for i:=0 to i" loop in Pascal - why does it work?

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

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

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

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

看起来是等价的,因为两者都打印 012345678910.

为什么它可以工作,为什么不能它在其他语言中工作?

这是可行的,因为在 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++;
}

因为 while 条件总是为真,你得到一个无限循环。


所以,总结一下:在 Pascal 中,最终值只计算一次并存储在一个未命名的临时变量中。 这意味着结束条件不随i改变。在其他语言中,它会在每次迭代时重新计算,而且不止一次。

注:

做类似

的事情
  i := 10;
  for i := 0 to i do

不受欢迎,因为即使它有效,它也会让 reader 感到困惑。而是使用不同的变量作为循环索引:

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

正如他们所说:“始终编写代码,好像最终维护您代码的人将是一个知道您住在哪里的暴力精神病患者。代码可读性。”来源: https://groups.google.com/d/msg/comp.lang.c++/rYCO5yn4lXw/oITtSkZOtoUJ