我用for语句做矩阵相乘的计算,发现循环计数器i,j,k不是从0开始,而是从大到小的。但是结果却是对的。太怪了。
语句如下:看看有没有高人解答一下:procedure TMform.BitBtn2Click(Sender: TObject);
var  y:array[0..3,0..3] of integer;
  a:array[0..1,0..3] of integer;
  tempvalue :integer;
  i,j,k,o,p:integer;
begin a[0,0]:=1;
 a[0,1]:=2;
 a[0,2]:=3;
 a[0,3]:=4;
 a[1,0]:=1;
 a[1,1]:=2;
 a[1,2]:=3;
 a[1,3]:=4;
 y[0,0]:=1;
 y[0,1]:=2;
 y[0,2]:=3;
 y[0,3]:=4;
 y[1,0]:=0;
 y[1,1]:=1;
 y[1,2]:=2;
 y[1,3]:=3;
 y[2,0]:=0;
 y[2,1]:=2;
 y[2,2]:=3;
 y[2,3]:=5;
 y[3,0]:=1;
 y[3,1]:=3;
 y[3,2]:=5;
 y[3,3]:=7; for i:=0 to 0 do        //i row,j column
 for j:=0 to 3 do    //j=4
  begin
    tempvalue:=0;
     for k:=0 to 3 do   //k=4
     begin
        tempvalue:=a[i][k]*y[k][j]+tempvalue;
     end;
     self.Memo1.Lines.Add(floattostr(tempvalue));
   end;
end;

解决方案 »

  1.   

    我随便写了别的for语句测试,发现计数器确实是从初始值开始的啊。并且按照你说的,那和downto有什么区别呢?
      

  2.   

    4楼的说法也站不住,我在上面的程序下面再额外来一个简单的循环语句,发现i,j的循环值却是从小到大的:
    源程序如下:你可以测试一下:
    var
      y:array[0..3,0..3] of integer;
      a:array[0..1,0..3] of integer;
      tempvalue :integer;
      i,j,k,o,p:integer;
    begin
     a[0,0]:=1;
     a[0,1]:=2;
     a[0,2]:=3;
     a[0,3]:=4;
     a[1,0]:=1;
     a[1,1]:=2;
     a[1,2]:=3;
     a[1,3]:=4;
     y[0,0]:=1;
     y[0,1]:=2;
     y[0,2]:=3;
     y[0,3]:=4;
     y[1,0]:=0;
     y[1,1]:=1;
     y[1,2]:=2;
     y[1,3]:=3;
     y[2,0]:=0;
     y[2,1]:=2;
     y[2,2]:=3;
     y[2,3]:=5;
     y[3,0]:=1;
     y[3,1]:=3;
     y[3,2]:=5;
     y[3,3]:=7; for i:=0 to 0 do        //i=1
     for j:=0 to 3 do        //j=4
      begin
        tempvalue:=0;
         for k:=0 to 3 do    //k=4
         begin
            tempvalue:=a[i][k]*y[k][j]+tempvalue;
         end;
         self.Memo1.Lines.Add(inttostr(tempvalue));
         //showmessage(floattostr(tempvalue));
       end;
    //另外一个循环
     tempvalue:=0;
     for i:=0 to 3 do   //i=0
     begin
      for J:=0 to 10 do   //j=0
        tempvalue:=tempvalue+j;
      self.Memo1.Lines.Add(inttostr(tempvalue*i));
     end;
      

  3.   

    这是Delphi编译器智能的表现。  如果执行方式不影响结果,编译器就会优化。
    优化的好处是显而易见的,比如一个for i:=0 to 5 do的循环如果不优化,i从0到5,生成的机器代码中势必有指令inc  ecx  ,cmp  ecx,5(或类似的语句),然后根据Flag寄存器判断是否循环已结束。如果优化了,生成的机器代码就不需要cmp指令了,因为dec  ecx本身已经对Flag寄存器有影响了这样就少生成了一条指令,别看只是少了一条指令,当n很大,如10000时,优化的好处就很明显了,因为计算机少执行了10000条指令!! 
      

  4.   

    对于你5楼的程序
    第一段循环显然是被优化了
    而第二段循环由于你加了一句 self.Memo1.Lines.Add(inttostr(tempvalue*i)); 这样优化的话会影响到结果,所以未被优化
      

  5.   

    当循环体中不使用index的时候,delphi会把常数项的循环优化成由高向低,因为这样生成的机器码可以减少一条用于和终值判断的语句,同时又不影响循环的语义和效果
      

  6.   

    楼主在调试的时候,去掉编译优化选项就行了在菜单project->options界面的compiler页,第一个选项optimizition不勾选
      

  7.   

    我这个程序是想要用数组来表示矩阵相乘的,我用a表示2 x 4的矩阵,y表示4 x 4的矩阵,a x y的时候,你说调试的时候看到a[i][k]是a[2][4],这个值能正确吗?我的数组下标明确是从0开始的,怎么会出现在a[2][4]这个值?
      

  8.   

    优化了吧,好像遇到过,可能是Delphi的Bug