在for循环中一个奇怪的问题?(100分)

  • 主题发起人 经典音乐
  • 开始时间
G

guifuli

Unregistered / Unconfirmed
GUEST, unregistred user!
const
n = 6
//常量(n代表裁判)

var
Scores:array[0..n-1] of real
//申明变量Scores为数组

procedure GetScore(s:array of real
var aver:real)
//定义过程体两个参数(传入、传出)
var
i:integer

max_s,min_s:real

sum:real

begin
sum := 0

max_s := s[0]

min_s := s[0]

for i := 0 to n - 1 do // 大家单步跟踪一下这里的i,肯定是由6到1,我在许多机器上试过,都是这样的,当然最后的结果是正确的
begin
if max_s < s then
max_s := s

if min_s > s then
min_s := s

sum := sum + s

end;
aver := (sum - min_s - max_s)/(n - 2)

end;


procedure TForm1.Button1Click(Sender: TObject);
var
ssdf:real;

begin
scores[0] := StrToFloat(edit1.Text);
scores[1] := StrToFloat(edit2.Text);
scores[2] := StrToFloat(edit3.Text);
scores[3] := StrToFloat(edit4.Text);
scores[4] := StrToFloat(edit5.Text);
scores[5] := StrToFloat(edit6.Text);
GetScore(scores,ssdf)

edit7.Text := FloatToStr(ssdf);
end;
 
W

wr960204

Unregistered / Unconfirmed
GUEST, unregistred user!
当然不是BUG。是编译器的优化结果。
如果你在循环中没用到那个循环变量那就是降序循环。
为什么这么做,去看看汇编语言就知道为什么要这么优化了。
 
G

guifuli

Unregistered / Unconfirmed
GUEST, unregistred user!
但是老大,以上的程序我只要把那个全局变量Scores:array[0..n-1] of real
放到变成局部变量放到ssdf:real;后面的话那么i又是从0到5了,请问这是怎么一回事?
汇编我根本不用学了,那些东西在现在用得不多了!!!!!!!!!
谢谢!!!
 
F

fly2003

Unregistered / Unconfirmed
GUEST, unregistred user!
经典音乐好样的,不放过任何一个问题。

这种精神值得学习。

是又问题。我碰到过
 

黑星星

Unregistered / Unconfirmed
GUEST, unregistred user!
是DELPHI的BUG吧,我也同样碰到过
 
R

red03hunter

Unregistered / Unconfirmed
GUEST, unregistred user!
---------------------------------------------------------
来自:wr960204, 时间:2004-2-20 12:47:23, ID:2463948
当然不是BUG。是编译器的优化结果。
如果你在循环中没用到那个循环变量那就是降序循环。
为什么这么做,去看看汇编语言就知道为什么要这么优化了。
----------------------------------------------------------
同意!
循环变量(如上面的j)会被分配一个内存地址(如a),[j-42]会被编译器直接编译为将地址a的内容减42后放回地址a,这样你的循环次数就少了42,下次循环再少42......
另外如果你在循环中没用到那个循环变量,编译器会直接使用CX(ECX)寄存器存放循环次数,而在80X86体系机器中,CX是循环计数器,每执行一次循环操作CX减1.
以上只是Delphi编译器的优化,不是BUG!
Delphi程序所以执行快捷,是因为其编译结果十分贴近汇编语言,冗余代码很少.
汇编语言不用去学,但了解计算机基本原理和基本的汇编常识对编程还是大有好处的.
 
Z

zhouym

Unregistered / Unconfirmed
GUEST, unregistred user!
应该是index的事
 

流浪者888

Unregistered / Unconfirmed
GUEST, unregistred user!
这个东东在Delephi中是存在的,不过只是在单步跟踪的时候表现出来给我们的,但是它真正的循环是不会影响程序的。
 
L

lich

Unregistered / Unconfirmed
GUEST, unregistred user!
不影响运行结果就行
 
R

RailGundi

Unregistered / Unconfirmed
GUEST, unregistred user!
编译器优化的结果,如果在循环体内没有用到该变量,那么该变量就只不过是一个,循环计数器,编译器会对他进行优化,如果在循环体内有用到该变量,则编译器,就会按源代码的顺序编译
 
Z

zxdcj

Unregistered / Unconfirmed
GUEST, unregistred user!
这是正常的,如果没有用到这个控制变量,那么将从上往下,这样并不会产生错误,而编译器可以产生更优化的代码
因为它循环的次数并不会受到影响,当然不会出问题
 
顶部