Lazarus中文社区

 找回密码
 立即注册(注册审核可向QQ群索取)

QQ登录

只需一步,快速开始

Lazarus IDE and 组件 下载地址版权申明
查看: 2433|回复: 3

循环结构的控制变量问题

[复制链接]

该用户从未签到

发表于 2013-4-20 11:30:16 | 显示全部楼层 |阅读模式
for i:=1 to 9 do write(i);
write(i);
为什么输出结果是1234567899,而不是12345678910? 希望哪位能给我讲讲在free pascal中对循环结构是如何运作(流程),和出现这种结果的本质原因。谢谢!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册(注册审核可向QQ群索取)

x
回复

使用道具 举报

该用户从未签到

发表于 2013-4-23 15:10:46 | 显示全部楼层
这个正常得不能再正常了。
循环体到了do后执行完第一个write(i)时循环宣告结束,此时i为9;执行第二句write(i)也不过是告诉程序“你再帮我打印一下看看i 现在是多少?”
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2013-4-29 09:54:45 | 显示全部楼层
语言行为定义:如果在for过程中break,那么循环变量为跳出时的值;如果循环正常结束,循环变量未定义。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2013-4-30 09:01:19 | 显示全部楼层
本帖最后由 samsam598 于 2013-4-30 15:29 编辑

i应是在var里声明,在i:=1时获得初值,生命期直至过程结束。
在C++(c99也可以)里有这样一种情况:

  1. for(int i=1;i<10;i++)
  2. {
  3.     printf("%d\n",i);
  4. }
  5. printf("%d\n",i);//------------------>错误,变量i 未定义
复制代码
有VB.Net2008里,也可以这样:

  1. For i As integer =1 To 9
  2. Console.Writeln("{0}",i)
  3. Next
  4. Console.Writeln("{0}",i)   '-------------------------->错误,变量i 未定义
复制代码
这两种其实都是在循环体内声明变量并初始化,离开循环时变量均已销毁。而在FP里变量都要在使用之前先声明,没有象c++和VB.NET里这种声明+赋初值+循环一趟子过的语法。在FP2.7.1里即便是在嵌套过程里,外层变量都不能被内层过程识别,内层过程声明的变量也不能被外层过程识别。所以说c语言的语法灵活,也有人说pascal是紧身夹克,虽有些拘束但不会乱来;而C则是大板斧,你想怎么使都行,不过你得祈祷不要砍在自己脚上。

  1. procedure doOuter;
  2. var
  3. i:integer;
  4. procedure doInner:
  5. var
  6.     j:integer;
  7. begin
  8.   {内层过程}
  9.    for i:=1 to 9 do  // ------------>Error: Illegal counter variable
  10.     for j:=1 to 9 do
  11.      ...
  12. end;
  13. begin
  14. {外层过程}
  15. end;
复制代码
回复 支持 反对

使用道具 举报

*滑块验证:

本版积分规则

QQ|手机版|小黑屋|Lazarus中国|Lazarus中文社区 ( 鄂ICP备16006501号-1 )

GMT+8, 2025-5-2 21:47 , Processed in 0.029336 second(s), 10 queries , Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表