我的实验:
var
i,j:Integer;
....
程序一:
j:=0;
for i:=0 to 10 do inc(j);
caption:=IntToStr(j);
程序二:
j:=0;
for i:=7 to 17 do inc(j);
caption:=IntToStr(j);
这两个程序的最后代码是完全相同的,循环部分汇编程序:
.....
mov eax $B //循环次数
inc ebx
dec eax //1
jnz -$4 //2
12两句控制循环结束
程序三:
j:=0;
for i:=10 downto 0 do inc(j);
caption:=IntToStr(j);
.....
mov eax $FFFFFFF5 //设定循环次数,用减法
inc ebx
inc eax //1
jnz -$4 //2
12两句控制循环结束
因为i只是起到一个计数器的作用,其他地方用不到i,所以可以用高效的实现方法。
显然,这段代码是非常高效的,且结果完全符合设计要求。
Delphi在编译时将to语句变成用 dec 来实现,而downto变成用 inc 来实现,
为什么会这样,可能只有Borland的开发小组能说清了,
也许是为了加快编译速度的需要。
程序四:
j:=0;
for i:=0 to 10 do
begin
inc(j);
caption:=IntToStr(i);
end;
caption:=IntToStr(j)
这时候的最后代码发生了变化,循环部分汇编程序如下:
mov ebx,$7
inc edi
...//实现caption:=IntToStr(i);
inc ebx //1
cmp ebx,$12 //2
jnz -$1B //3; 123三句控制循环结束
因为用到了i,所以这一次不会对改变原来的结构。
另外,实验一下下面的代码:
j:=0;
for i:=7 to 17 do inc(j);
Caption:=IntToStr(i);
看一下编译时产生的信息就会不难理解 for 语句的实现方法了。