Delphi还真贴心啊,哈哈。
procedure TForm1.Button1Click(Sender: TObject);
var
  i:integer;
begin
  i := 4;
  for i := 0 to i - 1 do
    showmessage(inttostr(i));
end;

解决方案 »

  1.   

    Delphi在循环开始把i+1算出来放在ESI中,以后就不用变量i了。我以前都是用两个变量完成这个循环功能,现在看真是多此一举啊。
      

  2.   

    本来就是可以的http://lysoft.7u7.net
      

  3.   

    呵呵,如果不是ShowMessage用到了i,还有更有意思的事呢:)
    试试看
      

  4.   

    很正常
    就像
    i:=4;
    i:=i+1;
    一样没什么
    关键是

    i:=4;
    后在
    for i:=0 to i-1 do
    中首先运算i-1 ,这是优先运算的
    确定了最大值以后才开始逐步增加
      

  5.   

    呵呵,C语言里可不是这样的。
    i=4;
    for(i=0;i<i-1;i++)
      printf("%d",i);
    不执行循环的。那孩子他爹,不用i有什么有意思的事啊?
    for i := 0 to i - 1 do
        showmessage('hello world');
    打四个hello world,没什么啊。这不能是bug,只是优化。
      

  6.   

    to  lw549(那个孩子他爹)
    好像没什么奇特事件发生?!
      

  7.   

    good good learn,day day up!
      

  8.   

    还真从没这样写过这样的语句:for i := 0 to i - 1 do
        showmessage('hello world');乍一看,真的有点迷惑,不推荐省那么一个变量声明
      

  9.   

    以前我的代码会是这样:
    function Sum:integer;
    begin
      进行一番计算;
      result := 一个计算结果;
    end;procedure Main;
    var
      i,j:integer;
    begin
      j := Sum;//先取出值,以为循环中每次都需要调用一次函数
      for i := 0 to j - 1 do
      ;
    end;现在可以放心的写:
      for i := 0 to Sum - 1
    因为我知道Sum函数只会执行一次哈。
      

  10.   

    回复人: eastliangliang(青苹果) ( ) 信誉:137  2005-03-04 14:27:00  得分: 0  
     
     
       呵呵,C语言里可不是这样的。
    i=4;
    for(i=0;i<i-1;i++)//--------------老大,这行和上一行i=4 之间是不是有什么冲突?当染不能执行了!
      printf("%d",i);
    不执行循环的。那孩子他爹,不用i有什么有意思的事啊?
    for i := 0 to i - 1 do
        showmessage('hello world');
    打四个hello world,没什么啊。这不能是bug,只是优化。
      
     
      

  11.   

    Delphi还真贴心啊,哈哈。
    procedure TForm1.Button1Click(Sender: TObject);
    var
      i:integer;
    begin
      i := 4;
      for i := 0 to i - 1 do  //这里的i-1 运算先于i:=0,而且for 循环事先确定循环次数,
    //不像 while <条件> do 那样每次循环前要进行重新判断.因此这里i-1只执行了一次.
        showmessage(inttostr(i));
    end;我分析的对不?
      

  12.   

    for循环是事先确定循环次数的,你可以在调试的时候打开CPU看汇编,我说过,Delphi先把循环次数算出来放在寄存器ESI中,以后每次减1,不会再重新计算循环次数啦。
    C语言是每次都计算循环条件的,不过它的for循环功能强大,这样做也是为了能实现其它循环的功能。
    谁把C语言的for循环的反汇编代码贴出来,我机器上只有老式TC,还不太会使^_^
      

  13.   

    所以,谁都没有资格教训新手:我已经精通XXX......写程序,就得学到老
      

  14.   

    回来晚了,循环中不用i,可以单步跟踪一下,发现i是从大到小执行的,和for的写法没有关系,原理上面已经说了。
    >>for循环是事先确定循环次数的,你可以在调试的时候打开CPU看汇编,我说过,Delphi先把循环次数算出来放在寄存器ESI中,以后每次减1,不会再重新计算循环次数啦。