我有一个与for循环在Pascal中的工作方式有关的问题:
Program example;
var i:integer;
Begin
i:=7;
for i:=1 to i do write(i);
End.
这段代码输出:1234567
。
我认为编译器会生成变量i
的辅助副本,然后在for
循环中使用该副本。
答案 0 :(得分:3)
请注意,根据ISO7185标准,这需要在Pascal中使用。应在修改循环计数器之前复制“结束值”。
https://github.com/Leporacanthicus/lacsap/blob/master/test/Basic/iso7185pat.pas#L761
答案 1 :(得分:2)
在Pascal的for loop
中,我们有一个名为loop counter
的变量来控制循环的迭代,而这个变量在循环的每次迭代中都会发生变化,所以就是这样在此处声明的i
:代码中的i:=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 会创建此变量的副本。
希望它会有所帮助! 如果是,请通过投票通知我。
问候!
答案 2 :(得分:2)
这里的要点是Pascal编译器会在第一次执行时设置 for 的参数。然后在对控件值执行任何操作之前设置起点 i:= 1 和结束点 7 ,然后启动循环。
但我应该指出,这在编程中是糟糕的做法。除非你只是在提出一个学术性或投机性的问题,否则我认为没有理由去拯救"做一个像这样的变量名。
有趣的是要注意,如果在循环内部完成,滥用控制变量名称可能会导致不可预测的结果。
正如他们在那些表现出危险冒险的节目中所说的那样,不要试图在家里这样做!