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

Zim*_*ech 2 pascal loops

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

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

i := 10;
for i:= 0 to i do
begin;
    write(i);
end;
Run Code Online (Sandbox Code Playgroud)

for i:= 0 to 10 do
begin;
    write(i);
end;
Run Code Online (Sandbox Code Playgroud)

看起来是等同的,因为两个都打印012345678910.

它为什么有用,为什么它不能用于其他语言?

Rud*_*uis 5

这是有效的,因为在Pascal中,循环的结束值仅被评估一次,即在i进入循环时获取的值.

换句话说,Pascal代码就好像你做了:

someHelpVar := i;
for i := 0 to someHelpVar do
Run Code Online (Sandbox Code Playgroud)

而且,相反,它相当于:

someHelpVar := i;
i := 0;
while i <= someHelpVar do
begin
  ...
  i := i + 1; // or Inc(i);
end;
Run Code Online (Sandbox Code Playgroud)

在其他语言中,例如C,如果你这样做:

for (i = 0; i <= i; i++)
Run Code Online (Sandbox Code Playgroud)

你不是这样做的.在每次迭代时重新评估结束值,即不仅一次.上面的代码如下:

i = 0;
while (i <= i)
{
    ...
    i++;
}
Run Code Online (Sandbox Code Playgroud)

因为条件总是如此,你会得到一个无限循环.


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

注意:

做点什么

  i := 10;
  for i := 0 to i do
Run Code Online (Sandbox Code Playgroud)

不赞成,因为尽管它有效,但对于读者来说却是令人困惑的.而是使用不同的变量作为循环索引:

var
  i, j: Integer;
begin
  i := 10;
  for j := 0 to i do
Run Code Online (Sandbox Code Playgroud)

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