var
  i, j : DWORD;
begin
  j := 0;
  for i:=0 to j-1 do
  begin
    哈哈,成了一个死循环,大家以后小心啊!
  end;
end;

解决方案 »

  1.   

    是一个死循环,这也许是一个BUG,但是也许不是,因为在设计时,你不会有这样做的想法。除非是用关键词downto这个就不会是死循环了啊。
      

  2.   

    To: 楼上,‘设计时,你不会有这样做的想法’
    这样的时候太多了!
    很简单的:
    for i:=0 to ListBox1.Items.Count-1 do
    ...
    经常ListBox1.Items.Count是0 啊。
      

  3.   

    呵呵,
    这不算是个bug,本身就是个常理
    你有这么设计吗??
    如果你认为**.count-1<0时,你应该去避免这个错误,不是交给IDE去处理
      

  4.   

    不可能的,这么简单的个问题, d5+sp2,d7,d6+sp2 都没问题
    我想没有升级也不应该有错,如果有这种问题delphi也太弱了
      

  5.   

    d7 + xp 确实存在此问题
      

  6.   

    j-1 不是-1,而是 $FFFFFFFF-1,是32位中第二大的整数。
      

  7.   

    这个不是BUG。无符号整数的减法不可能是负数,
    也是就说 
     j :DWORD;
    j=0;
    j-1 <> -1,而是等于-1的补码,等于 $FFFFFFFF,是最大的32位整数。我看了Delphi 6汇编出来的代码,证实了这个说法,而且我的电脑(C3 1.0G)也很快循环完了。
      

  8.   

    var
      i, j, k : DWORD;
    begin
      j:= 0;
      k:= GetTickCount();
      for i:=0 to J-1 do
      begin
    //    哈哈,成了一个死循环,大家以后小心啊!
      end;
      ShowMessage(IntToStr(GetTickCount()-k));
    end;我的11466ms 就出来接过了
      

  9.   

    我在win2000+delphi6的c400机子下程序死翘了
      

  10.   

    DWORD类型
    是pazee(耙子)说的正确
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      i,j:DWord;
    begin
      j:=0;
      ShowMessage(inttostr(j-1)); //看看 j-1 是几吧。4294967295($FFFFFFFF)
      exit;  for i:=0 to j-1 do
      begin
        Caption:=IntToStr(i);
        refresh;
      end;
      

  12.   

    告楼上各位:
    var
      i,j:DWord;
    请把DWord换成Integer再看看会有什么情况?也许delphi并没有错,可是如果是C ,for (i=0;i<(j-1);i++ )会有这种情况吗!!!我只知道在这种情况下,我不需要计算机把j-1换成4294967295。在运行期间,你无法保证(j-1)不是负数,可一旦它是负数,你就不可能得到你想要得结果。所以提醒大家,用for循环的时候一定要检查一下循环变量是否正确(如果你用Delphi)欢迎继续讨论!
      

  13.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
        function GetDWORD(const A: DWORD): DWORD;
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}function TForm1.GetDWORD(const A: DWORD): DWORD;
    asm
      MOV EAX, A                       // 调式时,看看 A 的值就知道了!
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      j: DWORD;
    begin
      j := 0;
      ShowMessage(IntToStr(GetDWORD(J - 1)));
    end;end.
      

  14.   

    知道这样的情况,就用downto,实在不行了就不要用for循环。既然是写程序的,这点就不能懒IDE。
      

  15.   

    楼主,
    这和Delphi 完全没关系。这能说你是编程序的逻辑存在问题,属于人的问题。上学的时候有门功课就是计算机算法,讲人的逻辑转换为计算语言的时候需要注意的问题,你这个都是非常简单的例子。每个语言都有自己的特点特色,不能简单的把两种语言比较。Pascal的 运算优先级还和C有非常大差别呢,你能说pascal的不对。
      

  16.   

    Delphi 有严格的类型限制,不像 C 那么自由。
    for 循环的初值和终值的数据类型,在比较时都会转换为相应的循环变量的类型。
    你的例子中,i 是 DWORD,所以它不可能有负值。
    如果 i 是 Integer,j 仍为 DWORD,则会把 j 的值转换为 Integer,同样是 $FFFFFFFF,DWORD 的值是 4294967295,Integer 的值是 -1。另外,对于 for 语句来说,它的初值和终值是在进入 for 语句时就固定了,不会因为循环中对 j 的改变而影响循环次数。
      

  17.   

    *也许delphi并没有错,可是如果是C ,for (i=0;i<(j-1);i++ )会有这种情况吗!!!大家见笑了,为什么没有人对上面的话产生质疑呢?哈哈,其实,在VC中和Delphi是一样的:-)目前最喜欢的还是Delphi,不过不知道Delphi还能坚持多久......
      

  18.   

    你的翻译就有问题,Pascal就是这么一种语法非常严谨的强类型语言,你可以不用它,但不能说它有错unsigned int i, j;
    j = 0;
    for(i=0; i<(unsigned int)(j-1); i++);
    //或for(i=0; i<unsigned(j-1); i++);
    你应该这样试试很多时候C中灵活的类型转换可以被滥用并不是好事?