Pascal的for循环如何工作?

4

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

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

这段代码输出:1234567。 我认为编译器会创建变量i的一个副本,然后在for循环中使用它。


请编辑您的问题,提供一个真正描述您问题的标题。 - user4039065
抱歉,我不知道该选择什么标题,因为我只想知道为什么那段代码能够正常执行(为什么Pascal的for循环会像那样工作?)。 - LeDev
1
据我所知,规则是上限和下限只被评估一次。 如果没有寄存器可用,则将其存储在堆栈上的临时变量中。 - Marco van de Voort
非常感谢你的帮助!并不是因为我想这样写代码,只是对这段代码能够正常运行感到有些奇怪,所以才不得不询问。 - LeDev
循环实际上会执行以下操作(使用我在此称为endloop的隐藏变量或寄存器):endloop := i; i := 1; while i < endloop do begin write(i); inc(i); end;。就这样。没有第二个变量i - Rudy Velthuis
显示剩余2条评论
3个回答

3

2
这里的重点是Pascal编译器只会在第一次执行时设置< strong>for参数。然后,在处理控制值之前,它会设置起始点i:=1和结束点7,然后开始循环。
但我应该指出,这是编程中的不良实践。除非你只是提出一个学术或推测性问题,否则我看不到“节省”变量名的理由。
有趣的是,如果在循环内部执行此操作,这种滥用控制变量名称可能会导致不可预测的结果。
就像那些展示危险冒险的节目所说的那样,不要试图在家里做这件事!

1
上面的例子确实是为了学术目的而编写的。至于在“for循环”内修改“计数器变量”,这是不可能的,因为“Free Pascal”会输出一个错误。考虑以下示例:“Program example2; var i:integer; Begin for i:=1 to 7 do i:=5; End.”。它无法工作,因为存在“非法分配给for循环变量”的问题,至少在使用“Free Pascal”编译时是这样的,我不确定其他编译器是否也是如此。 - LeDev
2
在Delphi、Turbo Pascal等编程语言中相同,尽管错误信息的确切文本可能会有所不同。 - Rudy Velthuis

2
在 Pascal 中的 for 循环中,我们有一个名为“循环计数器”的变量来控制循环的迭代次数,并且这个变量在每次循环迭代中都会发生变化。所以在你的代码中声明了变量 i := 1 ,它就是控制循环计数器的变量。
第二个变量是在循环之前声明的变量,也被称为“i”,但它是循环的最终值。
请考虑以下内容:
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确实会创建变量的副本,如果您查看fpc生成的汇编代码(如@lurker所建议的) ,您会看到以下内容: movw U_P$EX_I,%si,其中U_P$EX_Ii的值。 - LeDev
我除了在Ideone上编写这段代码之外,没有其他访问Pascal编译器的途径。这段代码从Pascal的角度展示了你的问题的答案! :) 最好的问候! - Mack94

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接