我很惊讶没人问这个,因为这是我很久以前注意到的.
显然,在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.
它为什么有用,为什么它不能用于其他语言?
这是有效的,因为在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