pascal for循环是如何工作的?

pascal for循环是如何工作的?,pascal,Pascal,我有一个问题与for循环在Pascal中的工作方式有关: Program example; var i:integer; Begin i:=7; for i:=1 to i do write(i); End. 这段代码输出:1234567。 我认为编译器对变量I进行二次复制,然后在for循环中使用该变量。在for循环中在Pascal中,我们有一个名为循环计数器的变量,它控制循环的迭代,并且该变量在循环的每次迭代中都会发生变化,所以这里声明的是:i:=1 第二个是循环上方声明

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

Program example;
var i:integer;
Begin
     i:=7;
     for i:=1 to i do write(i);
End.
这段代码输出:
1234567

我认为编译器对变量
I
进行二次复制,然后在
for
循环中使用该变量。

for循环中
在Pascal中,我们有一个名为
循环计数器的变量,它控制循环的迭代,并且该变量在循环的每次迭代中都会发生变化,所以这里声明的是:
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编译器将在第一次执行时为
设置一次的参数。然后,在对控制值执行任何操作之前,它设置起点i:=1和终点7,然后启动循环

但我应该指出,在编程中,这是一种糟糕的做法。除非您只是提出一个学术性或推测性的问题,否则我看不出有任何理由“保存”一个变量名

还值得注意的是,如果在循环中执行此操作,那么滥用控制变量名称可能会导致不可预知的结果


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

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


请编辑您的问题,提供一个真正描述您的问题的标题。很抱歉,我不知道选择什么标题,因为我只想知道为什么这段代码能够正确执行(为什么pascal for循环会这样工作?).My pascal已生锈,但本质上i的值设置为循环开始时循环的终止;甚至在我之前:=1。出于同样的原因,你可以写i:=i*2。首先处理i×2,然后将结果返回i。您可以在文件上运行
fpc-a…
,它将为您提供汇编语言翻译(假设您使用的是免费的Pascal)。当我运行它时,它确实首先将
I
(刚刚分配了7)的值存储到
%si
寄存器,然后执行循环,将索引与
%si
进行比较。因此,您关于它如何工作的猜测似乎是正确的,但我肯定会避免编写这样的代码,除非(出于某种原因)绝对必要。我不能肯定所有的Pascal编译器都会以这种方式解释代码,因为规则是上界和下界只计算一次。如果没有免费注册,它将首先存储在stackFirst上的temp中,感谢您的帮助!Pascal确实创建了变量的副本,如果您查看fpc生成的asm(正如@Lougler所建议的),您可以看到以下内容:
movw U_P$EX_I,%si
,其中
U_P$EX_I
I
的值。除了我生成的Ideone之外,我还没有访问Pascal编译器的权限,这让人汗流浃背,此代码从Pascal的角度显示问题的答案!:)顺致敬意,上面的例子确实是出于学术目的。对于<代码>计数器变量在for <代码> for循环< /代码>中,这是不可能的,因为<代码>免费Pascal < /代码>将输出一个错误。请考虑下面的例子:<代码>程序示例2;varⅠ:整数;从i:=1到7开始i:=5;结束。
。由于对for循环变量的
非法赋值
,它将无法工作,好吧,至少当您尝试使用
免费pascal
编译它时,您会得到这样的结果,我不确定其他编译器。在Delphi、Turbo pascal等中也是如此。尽管错误消息的确切文本可能不同。