pascal for 循环是如何工作的?

How does the pascal for loop work?

我有一个关于 for 循环在 Pascal 中的工作方式的问题:

Program example;
var i:integer;
Begin
     i:=7;
     for i:=1 to i do write(i);
End.

这段代码输出:1234567。 我认为编译器制作了变量 i 的第二个副本,然后在 for 循环中使用该副本。

在 Pascal 的 for loop 中,我们有一个名为 loop counter 的变量,它控制循环的迭代,并且这个 变量在循环的每次迭代中变化 ,所以它是在此处声明的 ii:=1 在您的代码中。

第二个是在循环上方声明的变量,它也被称为 i 但它是一个变量,它是循环的 final value

考虑一下:

Program example;
var i:integer;
var addr:^word;
Begin
     i:=10; 
     for i:=1 to i do addr:=@i;
     addr^ := addr^+1; { I add 1 to the last loop counter }
     writeln(i);       { This is final variable, I don't add anything to the final variable of the loop }
     writeln(addr^);   { This is value of the last loop counter index  }
                { Both variables give us the same result }
                { Proposal: In my opinion, your guess about the copy is correct } 
End.

正如代码中的注释一样——在我看来,pascal 创建了这个变量的副本

希望对您有所帮助! 如果是,请通过投票让我知道。

此致!

这里的要点是 Pascal 编译器将在第一次执行时为 for 设置一次参数。然后它设置一个起点 i:=1 和终点 7 在对控制值做任何事情之前,然后开始循环。

但我应该指出,这是编程中的不良做法。除非你只是提出一个学术或推测性的问题,否则我认为没有理由 "save" 一个变量名来做这样的事情。

同样值得注意的是,如果在循环内进行这种滥用控制变量名称的行为,可能会导致不可预知的结果。

正如他们在那些展示危险冒险的节目中所说的那样,不要试图在家里这样做!

请注意,根据 ISO7185 标准,这是在 Pascal 中工作所必需的。 "end value" 应在修改循环计数器之前复制。

https://github.com/Leporacanthicus/lacsap/blob/master/test/Basic/iso7185pat.pas#L761