用for循环出现严重错误。(100分)

  • 主题发起人 主题发起人 ccweifen
  • 开始时间 开始时间
C

ccweifen

Unregistered / Unconfirmed
GUEST, unregistred user!
用以下循环时变量A,B为何从上到下递减?
for a:=1 to 10 do
for b:=1 to 5 do
for c:=1 to 4 do
........
用单步调试发现变量a从10到1递减,a 从5到1递减,最内层的c正常。
而我把它改成:
for a:=10 downto 1 do
for b:=5 downto 1 do
.....
时,刚开始 a 的值为 -10 ,这是不是DELPHI的问题?如何解决?
 
我试过了, 没有这个问题, 请你把源程序贴出来,可能是其他问题引起的。
 
原程序很长,我用以下代码试了一下,还是这样的。
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
sum:integer;
begin
for a:=1 to 10 do
for b:=1 to 5 do
for c:=1 to 4 do
sum:=sum+c;
end;
a从10减到1,b从5减到1。
重装DELPHI能否解决?
步长如何设定?


 
试试下面,一切正常。
procedure TForm1.Button1Click(Sender: TObject);
var a,b,c:integer;
sum:integer;
begin
for a:=1 to 10 do
begin
label1.Caption:=label1.Caption+inttostr(a);
for b:=1 to 5 do
for c:=1 to 4 do
sum:=sum+c;
end;
end;
 
把编译优化关掉试一试。(一般情况下判零转移比较快)
 
会有这种问题?是不是你的A没有初始化?在具体过程中还是从10到1吧?若不是,真的才怪耶.
 
creation-zy说的有一些道理的, 一般地, 如果你在循环内没有对循环变量进行引用,
系统会将其优化, 即:

for i=1 to 10 do
...
会被优化成: (大致为)
mov ecx, 10 //cx等同i
forloop:
...
loop forloop //等价于: dec ecx
jnz forloop

这样的指令效率最高, 而如果进行了引用, 那就变成了:
mov ecx, 1
forloop:
...
cmp ecx, 10
ja overloop
inc ecx
jmp forloop
overloop:
...

显然多了一个cmp指令, inc和dec都是一个指令周期, ja和jnz都一样
而且从代码上来说也多了许多.

此外, 对循环变量的赋值也可能造成这种情况,一般是不允许对for的循环变量赋值的
 
wjiachun:
用你的代码a是从1到10的,单步调试时b还是从5到1 ,
而在b循环中加入label2.Caption:=label2.Caption+inttostr(b);单步调试发现
b也是从1到5的。而如果在a循环中去掉label1.Caption:=label1.Caption+inttostr(a);
a 还是从10递减到1。
?????

 
看看Iknow 的分析吧,其实如果你这个循环变量什么都不干的话,它优化一下,只是
循环次数而已,不用整形也一样。比如
for c:='a' to 'm' do ……
而你需要用到这个变量时它给你的结果依然是正确的
 
在程序中我对循环变量是引用的,创建了一个三维数组,num[a][c],
如果a,b变量不按正常规律递增,那么在程序中得到的num[a][c]值是不正确的。

creation-zy:‘编译优化关掉 ’是不是指在project>options>compiler
下去掉optimization选项?我这样做了,没效果。

Iknow:看不太明白,具体怎么解决?

 
多人接受答案了。
 

Similar threads

回复
0
查看
978
不得闲
S
回复
0
查看
685
SUNSTONE的Delphi笔记
S
S
回复
0
查看
645
SUNSTONE的Delphi笔记
S
S
回复
0
查看
835
SUNSTONE的Delphi笔记
S
S
回复
0
查看
765
SUNSTONE的Delphi笔记
S
后退
顶部