有没搞错:
For i:=1 to 5 doFor i:=5 downto 1 do

解决方案 »

  1.   

    你们难道没有发现吗?偶是Delphi6,不知道以前的版本是不是这样的!
      

  2.   

    For i:=1 to 5 循环时i从5开始倒序。是的,是有这种情况。
    好象我在大富翁见到过这种问题的,你去查查,为什么可能就是Delphi的优化处理。我也不太清楚了
      

  3.   

    很有意思,只要你用showMessage(intToStr(i)),显示中间变量i的时候,那样就是正常的.如果是调试来看i的值总是倒序的!
      

  4.   

    zswang(伴水)(被黑中),没有什么具体代码,你不信,自己跟踪试试看!
      

  5.   

    我用Delphi6试了一下,没有问题,你搞错了,要想倒序,用for I:=5 downto 1 do
      

  6.   

    这种问题,我也碰到过呀!没办法只好用While了!!
      

  7.   

    楼上的,你不要在程序中显示这个i,要使用调试来看i,你再看看。这是我的代码:
    procedure TForm1.Button1Click(Sender: TObject);
    var
     i:integer;
    begin
      for i:=0 to 5 do
      begin
         showmessage(''); //在这里中断!
      end;end;
      

  8.   

    windlucky(月亮的足音)??你改用while了?不会吧?它的这种优化一般不会影响到结果的吧? 
      

  9.   

    for I := 1 to 5 do
      ShowMessage(IntToStr(I)); //这里对就可以了
      

  10.   

    with TStringList do try
      Text := '在下面加一个断点,看看Text的值';
      ShowMessage(Text); //断点//Text显示的是Form.Caption
    finally
      Free;
    end;
      

  11.   

    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;
      

  12.   

    with TStringList.Create  ...
                    ~~~~~~~~~
      

  13.   

    这是编译器优化的问题procedure TForm1.Button1Click(Sender: TObject);
    var
    i:integer;
    begin
      for i:=10 to 15 do
      begin
        showmessage(''); //在这里中断!
      end;
    end;
      

  14.   

    你用 For i:=5 downto 1 do 试试看
    是不是顺序的
      

  15.   

    倒! For i:=5 downto 1 do 
    居然是从-5开始递增!!!!!!!!Delphi的优化真是匪夷所思,呵呵,不过蛮有意思的!
      

  16.   

      for I := 10000 to 10005 do//6->1减少内存占用,加快计算速度
      

  17.   

    是呀,delphi5也是一样,弄得我有的时候调试还以为我的程序错了呢
      

  18.   

    Delphi有时候感觉聪明过头了些,呵呵!
      

  19.   

    汇编中循环一般用CX(ECX)做计数器,用JCXZ(JECXZ)判断循环是否结束,以加快速度。
      

  20.   

    不试不知道,一试问题更多,倒序确实存在,但。
    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.
      

  21.   

    恶人说得对,主要是机器语言中用dec X然后检查标志位是否为零的方法比用比较指令检查某寄存器或地址是否为某值的方法要快得多,也就是说,降序循环比升序循环容易实现。
      

  22.   

    原来如此!
    hellion(恶人)和dragoncircle()都是高人!继续关注!
      

  23.   

    学过汇编编程就知道了。再汇编语言(或者说机器码中),当CX(ECX)寄存器的值为0 的时候,循环就会自动结束(Loop指令的功能)。所以为了优化(只用一个指令实现),最好是采用倒序!
      

  24.   

    你不说,我还差点给忘了呢!我也碰到过!我当时以为是自己学艺不精。没想到是BORLAND的问题。
      

  25.   

    我想可能是编译器设计的原因吧,
    pascal在入栈时是从左向右开始的,这样可以在出栈时就应用相应的地址,减少程序执行的时间,不知是不是这个原因……
      

  26.   

    for i := 0 to 5 do
    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(憨憨)那里得到的启发。大家认为呢?
      

  27.   

    第二段程序有错,改成这样就对了,不好意思,呵呵    mov cx, 0
    label_1:
        ; dosomething
        inc cx
        cmp cx, 5
        jnz label_1
      

  28.   

    http://www.csdn.net/Expert/topic/449/449418.shtm
    去那里看看有TTs的控件
      

  29.   

    这是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;
     
       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这个世上少有的优秀编译器的名声,不是吹出来的.