Delphi 中奇怪的嵌套循环 ( 积分: 0 )

  • 主题发起人 主题发起人 lovell
  • 开始时间 开始时间
L

lovell

Unregistered / Unconfirmed
GUEST, unregistred user!
var
i,j,n,k:integer;
begin
n:= 0;
k:= 0;
for i:=1 to 100do
begin
for j:=100do
wnto 1do
begin
n:=n+1;
end;
k:=k+1;
end;
Showmessage(string(n));
Showmessage(string(k));
end;
上面的循。我的计算机是不能正常运行的。最好玩的是两个循环的局部变量编译后的值。没事无聊的可以试试
 
你没写对吧
Showmessage(string(n));
Showmessage(string(k));
???
Showmessage(IntToStr(n));
Showmessage(IntToStr(k));
 
把你的代码试了下,编译发生异常,按照二楼的试了下,一切正常.
执行结果一个10000 一个100
 
你提到的循环局部变量编译的值是不是指的FOR 循环中i j 的值变化
这个我以前设了个断点调试到的,FOR i:=1 TO 100的时候 i一上来就是100的
这个问题我同学也发现过的,但是你要是在for循环中加入一句I的显示 会发现显示出来是对的.
for i:=1 to 100do
begin
for j:=100do
wnto 1do
begin
n:=n+1;
end;
Showmessage(inttostr(i));//加上去的,第一次显示1
k:=k+1;
end;
Showmessage(inttostr(n));
Showmessage(inttostr(k));
end;
个人认为这应该是编译器做的其它工作,可能循环时候是倒好了循环的,但i值显示又是对的
个人对汇编不属性,建议直接查看该段的ASM ,一下就能看懂.
 
最好玩??????不覺得﹗﹗﹗﹗﹗
 
将整数强制转字串,极度无聊。
 
如果某个for循环中,不使用到该循环变量,那么编译器会将他优化反向循环。
从汇编上考虑,例如 for i =0 , 99
xor i,i
loop
inc(i)
cmp i,99 <== 这里会有个比较语句
jb loop
反向循环 for i=99do
wnto 0
mov i,99
loop
dec(i)
jnz loop <== 少了一句比较
显然,后面的执行效率会更高一点..
 
to:melice
你的代码我看了 是有一定的道理,可是你试试看把循环变量打印出来 它还是对的
看来编译器做的工作多多了
 
超级old的问题,论坛讨论多多
 
后退
顶部