delphi 循环变量的问题

blueseawww 2010-05-11 04:10:27

program Project2;

{$APPTYPE CONSOLE}

uses
SysUtils;

var
i :Integer;

begin
{ TODO -oUser -cConsole Main : Insert code here }
for i :=1 to 5 do
begin
Writeln(IntToStr(i));
end;

for i :=1 to 5 do
begin
Writeln('hello');
end;

Readln;
end.



为什么第二个循环i是从5开始递减到1啊
...全文
89 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
亮剑_ 2010-05-12
  • 打赏
  • 举报
回复
编译优化的缘故,僵哥已经解释的很明白了
blueseawww 2010-05-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 unsigned 的回复:]
这叫尽可能最优化处理。

在第二个循环当中及其后所有的处理都不依赖i的值,因此编译预处理例程认为其只需要保证循环的有效次数,由于dec和add指令周期相关,因此至少可以减省一条赋值指令。
[/Quote]

正解!
僵哥 2010-05-12
  • 打赏
  • 举报
回复
dec和add指令周期相等
僵哥 2010-05-12
  • 打赏
  • 举报
回复
这叫尽可能最优化处理。

在第二个循环当中及其后所有的处理都不依赖i的值,因此编译预处理例程认为其只需要保证循环的有效次数,由于dec和add指令周期相关,因此至少可以减省一条赋值指令。
merrymin 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lipengpeng8188 的回复:]
真服你们了,就是第一次循环,i的指针指向5的位置,这样当然下一次循环起始时调试器里面显示为5了。
[/Quote]
只用一个for循环 for i :=0 to 5 调试一下就知道了,别想当然咯。。。O(∩_∩)O~
lipengpeng8188 2010-05-11
  • 打赏
  • 举报
回复
真服你们了,就是第一次循环,i的指针指向5的位置,这样当然下一次循环起始时调试器里面显示为5了。
ok1411 2010-05-11
  • 打赏
  • 举报
回复
好像碰到过,我碰到时好像循环体里还用到变量的
merrymin 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ysai 的回复:]
编译器优化的,如果循环里没用到循环变量,默认编译选项下,就会这样优化
[/Quote]

经过调试测试,的确是这样,又学习了!
yktd26 2010-05-11
  • 打赏
  • 举报
回复
好像确实是这样,我好像也遇到过
lw19860412 2010-05-11
  • 打赏
  • 举报
回复
重要的是这样优化有什么好处呢
blueseawww 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sz_haitao 的回复:]
第二个循环 没有输出 i,怎么知道是 从5开始递减?
[/Quote]

调试时可以看啊
blueseawww 2010-05-11
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ysai 的回复:]
编译器优化的,如果循环里没用到循环变量,默认编译选项下,就会这样优化
[/Quote]
恩!我刚调试了一下!如果循环里用到循环变量,就是从1到5,如果不用到就是从5到1
yiier 2010-05-11
  • 打赏
  • 举报
回复
什么问题啊
winstonbonaparte 2010-05-11
  • 打赏
  • 举报
回复
你是怎麼看出是從5到1的?
hongss 2010-05-11
  • 打赏
  • 举报
回复
我测试怎么都是从1~5 ??
haitao 2010-05-11
  • 打赏
  • 举报
回复
第二个循环 没有输出 i,怎么知道是 从5开始递减?
ysai 2010-05-11
  • 打赏
  • 举报
回复
编译器优化的,如果循环里没用到循环变量,默认编译选项下,就会这样优化

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧