我用Delphi6试了一下,没有问题,你搞错了,要想倒序,用for I:=5 downto 1 do
这种问题,我也碰到过呀!没办法只好用While了!!
楼上的,你不要在程序中显示这个i,要使用调试来看i,你再看看。这是我的代码: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 5 do begin showmessage(''); //在这里中断! end;end;
for I := 1 to 5 do ShowMessage(IntToStr(I)); //这里对就可以了
with TStringList do try Text := '在下面加一个断点,看看Text的值'; ShowMessage(Text); //断点//Text显示的是Form.Caption finally Free; end;
zswang(伴水)(被黑中),这样当然可以。 所以这是Delphi一个非常有趣的现象。 只要你在for的循环中要保存这个i,或者显示这个i什么的操作,那么它就不会倒序。真的很有意思,Delphi还是相当聪明的,不该优化的时候就不优化! 这样是倒序: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 5 do begin showmessage(''); //在这里中断! end; end; 这样就是正确的顺序: procedure TForm1.Button1Click(Sender: TObject); var i:integer; a:TstringS ; begin a:=TStringList.Create; for i:=0 to 5 do begin showmessage(''); a.Add(intToStr(i)); end; end;
with TStringList.Create ... ~~~~~~~~~
这是编译器优化的问题procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=10 to 15 do begin showmessage(''); //在这里中断! end; end;
你用 For i:=5 downto 1 do 试试看 是不是顺序的
倒! For i:=5 downto 1 do 居然是从-5开始递增!!!!!!!!Delphi的优化真是匪夷所思,呵呵,不过蛮有意思的!
for I := 10000 to 10005 do//6->1减少内存占用,加快计算速度
是呀,delphi5也是一样,弄得我有的时候调试还以为我的程序错了呢
Delphi有时候感觉聪明过头了些,呵呵!
汇编中循环一般用CX(ECX)做计数器,用JCXZ(JECXZ)判断循环是否结束,以加快速度。
不试不知道,一试问题更多,倒序确实存在,但。 procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin j:=0; for i:=0 to 5 do begin j:=j+1 ; //A showmessage(''); //在这里中断! end; showmessage(inttostr(j)); //B如果去掉这句代码,A句程序根本就不执行,why? end; end.
这是Delphi编译器智能的表现。如下程序: procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 5 do begin showmessage(''); //在这里中断! end; end; 生成代码执行时i确实是倒序的--从6降到1,为什么呢?因 为循环体中没有对i的引用,所以Delphi就自动地做了优化--但 不论如何该干的事情还是干了---还是显示出6次信息框(如果优 化错了就不叫“优化”了 :p) 为什么要这样优化呢?如果不优化,i 从0 到 5 ,生成的 机器代码中势必有指令inc ecx ,cmp ecx,5(大概是这样的,不记 得了:p),然后根据Flag寄存器判断是否循环已结束。如果优化了, 生成的机器代码就不需要cmp指令了,因为dec ecx本身已经对Flag 寄存器有影响了---这样就少生成了一条指令,别看只是少了一条指令 当n很大,如10000时,优化的好处就很明显了,因为计算机少执行了 10000条指令!! 如果上述程序改为:procedure TForm1.Button1Click(Sender: TObject); var i:integer; begin for i:=0 to 5 do begin showmessage(inttostr(i)); //在这里中断! end; end;
那就不能利用递减至0来优化了,i就会老老实实地从0到5。
再看如下程序: procedure TForm1.Button1Click(Sender: TObject); var i,j:integer; begin j:=0; for i:=0 to 5 do begin j:=j+1 ; //A showmessage(''); //在这里中断! end; showmessage(inttostr(j)); //B如果去掉这句代码,A句程序根本就不执行,why? end;
好象我在大富翁见到过这种问题的,你去查查,为什么可能就是Delphi的优化处理。我也不太清楚了
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 5 do
begin
showmessage(''); //在这里中断!
end;end;
ShowMessage(IntToStr(I)); //这里对就可以了
Text := '在下面加一个断点,看看Text的值';
ShowMessage(Text); //断点//Text显示的是Form.Caption
finally
Free;
end;
所以这是Delphi一个非常有趣的现象。
只要你在for的循环中要保存这个i,或者显示这个i什么的操作,那么它就不会倒序。真的很有意思,Delphi还是相当聪明的,不该优化的时候就不优化!
这样是倒序:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 5 do
begin
showmessage(''); //在这里中断!
end;
end; 这样就是正确的顺序:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
a:TstringS ;
begin
a:=TStringList.Create;
for i:=0 to 5 do
begin
showmessage('');
a.Add(intToStr(i));
end;
end;
~~~~~~~~~
var
i:integer;
begin
for i:=10 to 15 do
begin
showmessage(''); //在这里中断!
end;
end;
是不是顺序的
居然是从-5开始递增!!!!!!!!Delphi的优化真是匪夷所思,呵呵,不过蛮有意思的!
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
j:=0;
for i:=0 to 5 do
begin
j:=j+1 ; //A
showmessage(''); //在这里中断!
end;
showmessage(inttostr(j)); //B如果去掉这句代码,A句程序根本就不执行,why?
end;
end.
hellion(恶人)和dragoncircle()都是高人!继续关注!
pascal在入栈时是从左向右开始的,这样可以在出栈时就应用相应的地址,减少程序执行的时间,不知是不是这个原因……
begin
{ ... }
end;这样是倒序的,但是快:
mov cx, 5
label_1: ; dosomething
loop label_1如果要正序则(类似):
mov cx, 0
label_1:
; dosomething
inc cx
cmp cx, 0
jnz label_1如果在程序中没有引用I变量,则生成倒序的代码,这样就快得多,不是吗?
从MSHawk(憨憨)那里得到的启发。大家认为呢?
label_1:
; dosomething
inc cx
cmp cx, 5
jnz label_1
去那里看看有TTs的控件
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 5 do
begin
showmessage(''); //在这里中断!
end;
end;
生成代码执行时i确实是倒序的--从6降到1,为什么呢?因
为循环体中没有对i的引用,所以Delphi就自动地做了优化--但
不论如何该干的事情还是干了---还是显示出6次信息框(如果优
化错了就不叫“优化”了 :p)
为什么要这样优化呢?如果不优化,i 从0 到 5 ,生成的
机器代码中势必有指令inc ecx ,cmp ecx,5(大概是这样的,不记
得了:p),然后根据Flag寄存器判断是否循环已结束。如果优化了,
生成的机器代码就不需要cmp指令了,因为dec ecx本身已经对Flag
寄存器有影响了---这样就少生成了一条指令,别看只是少了一条指令
当n很大,如10000时,优化的好处就很明显了,因为计算机少执行了
10000条指令!!
如果上述程序改为:procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to 5 do
begin
showmessage(inttostr(i)); //在这里中断!
end;
end;
那就不能利用递减至0来优化了,i就会老老实实地从0到5。
再看如下程序:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
j:=0;
for i:=0 to 5 do
begin
j:=j+1 ; //A
showmessage(''); //在这里中断!
end;
showmessage(inttostr(j)); //B如果去掉这句代码,A句程序根本就不执行,why?
end;
B如果去掉这句代码,A句程序根本就不执行,why?
道理很简单, 去掉这句代码B,做A就没用了,所以Delphi就优化掉了A.
再改一下:
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=3 to 5 do
begin
showmessage(inttostr(i)); //在这里中断!
end;
end;
你会发现,i是从3递减到1的,为什么?
啊!还问我!昏到中…………
:p 所以Delphi这个世上少有的优秀编译器的名声,不是吹出来的.