我很惊讶没有人问这个,因为这是我很久以前注意到的。
显然,在Pascal中,您可以将相同的变量用于循环计数器和多次重复。以下两段代码:
i := 10;
for i:= 0 to i do
begin;
write(i);
end;
和
for i:= 0 to 10 do
begin;
write(i);
end;
似乎是等效的,因为它们都打印012345678910
。
为什么起作用,为什么不能以其他语言起作用?
答案 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