funtion getcount : Integer;
begin
  result := 0;
end;....
  for I := 0 to getcount do
  begin
    if xxx then
      break;
  end;
  showMessage(i);
  执行的结果竟然不是0,而是一个随机的大数。这个也不是我猜的,delphi的帮助里面说的也是这样:“If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed. After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.”
  我们对FOR循环的理解是,置初值,然后判断,通过的话执行,否则跳出。delphi的这个实现打破了这个常规理解。
  随便使用一个C的编译器,甚至是borland的BCB。
  int i;
  for(i=0;i<0;i++);
  printf("%d",i);
  最后的结果都是0。

解决方案 »

  1.   

    我们对FOR循环的理解是,置初值,然后判断,通过的话执行,否则跳出。delphi的这个实现打破了这个常规理解。
    =======================================for循环还是for循环Delphi的For循环还是你想的那个For循环只是在for语句终止后,i值处于未定义状态Delphi就是这么规定的这有啥可郁闷的......
      

  2.   

    确实,出了循环之后就不应该再使用I这个变量才对。而不是抱怨编译有问题。在标准C++,C以及C#/Java里面,类似的情况下I都是仅在循环中才有意义的。出来循环就无意义了。Delphi的编译器这样编译,基本上保证了和其他语言的一致性。
      

  3.   

    不好意思,上面的两位好象都没有仔细看明白我的意思:
    1、After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.”。这句话我不知道是仅仅对于前面说的根本没有进行循环的情况,还是说所有的循环正常退出的情况。但是我的测试表明,如果delphi的循环至少执行了一次,那么正常跳出后I的值是确定的,就是finalvalue+1(对于TO的情况)。
    2、C++系列的变量声明可以在循环内部:
       for (int i=0;i<5;i++);
       这样很好理解,I的作用域本来就是这个FOR循环,任何变量出了作用域都是未定义的。
       但delphi的变量是必须是前置声明的,作用域包含整个过程,整个FOR循环都处在其中。因此不应该存在出来循环就没有意义的说法。
       和DELPHI相等价的C++的写法应该是
       int i;
       for(i=0;i<5;i++);
       前面说过,这样I的值可是确定的。也就是C++的I值是不是确定,是由使用者确定的。
    3、在实际应用中,也经常需要用到FOR跳出后的I值,主要用来对付是不是BREAK跳出的情况。
       比如对一个LIST进行有序插入:
       似乎应该这样写:
       for I:=0 to list.Count-1 do
       begin
         if xxx then
           break;
       end;
       insert(I,X);
       但是因为FOR不执行时I值不确定的问题,上面的代码改为:
       for I:=0 to list.Count-1 do
       begin
         if xxx then
           goto final;
       end;
       I := list.Count;
    final:
       insert(I,X);
    两位觉得是不是别扭?
      

  4.   

    因为FOR不执行时I值不确定的问题晕哦。。你说的这个跟for没关系这个叫代码优化因为for不执行,所以编译器编译的时候吧那段跳过了所以你的i当然没有初值了
      

  5.   

    答chijingde:
    那么人家C++的就没有代码优化了?
    代码优化最基本的原则是保证结果的正确,保证语意不被改变吧?
    我前面说了,FOR的语意应该是
    1.赋初值
    2.判断
    3.执行循环体
    4.增量
    5.到2按照这个语意,1,2是一定要执行的(不执行也行,但要保证结果的正确)。但是现在的情况是,经过所谓的优化以后,某些条件下,1,2根本不执行,结果也是无法预测的,这能够说是成功的优化吗?
      

  6.   

    这是优化的结果,但不是象那位说的那样是由于未执行导致的i不确定。
    而是由于优化的时候i根本没有被分配空间,而是使用寄存器(在当前的实现中,一般使用EAX)。
    为了得到你要的效果,可以关闭优化,或者使用全局变量(会有一个警告)。
      

  7.   

    另外说一句,Delphi中的for循环是一种简单循环控制,优化但是也简化,并不等同于C/C++中的for。
    与C/C++中的for等价的是while do循环,与C/C++中do while等效的是repeat until循环。
    先了解语言的特性,否则生搬硬套是要出问题滴。:)
      

  8.   

    for 0 to 0 也是要执行一次的
      

  9.   

    谢谢littlefishli:
    标题中应该是
    for I := 0 to getcount -1 do
    写漏了