funtion getcount : Integer;
begin
result := 0;
end;....
for I := 0 to getcount do
begin
if xxx then
break;
end;
showMessage(i);
执行的结果竟然不是0,而是一个随机的大数。这个也不是我猜的,delphi的帮助里面说的也是这样:“If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed. After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.”
我们对FOR循环的理解是,置初值,然后判断,通过的话执行,否则跳出。delphi的这个实现打破了这个常规理解。
随便使用一个C的编译器,甚至是borland的BCB。
int i;
for(i=0;i<0;i++);
printf("%d",i);
最后的结果都是0。
begin
result := 0;
end;....
for I := 0 to getcount do
begin
if xxx then
break;
end;
showMessage(i);
执行的结果竟然不是0,而是一个随机的大数。这个也不是我猜的,delphi的帮助里面说的也是这样:“If initialValue is greater than finalValue in a for...to statement, or less than finalValue in a for...downto statement, then statement is never executed. After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.”
我们对FOR循环的理解是,置初值,然后判断,通过的话执行,否则跳出。delphi的这个实现打破了这个常规理解。
随便使用一个C的编译器,甚至是borland的BCB。
int i;
for(i=0;i<0;i++);
printf("%d",i);
最后的结果都是0。
解决方案 »
- NOD32 报我编写的程序是病毒???
- ehlib中的dbgrideh能否只定义其中一列的mousemove事件
- serversocket,clientsocket控件是采用什么协议的
- 在问一个数据库方面问题。
- ADOQuery中如何对对select出来的记录直接操作?
- 欲学delphi,有点c/c++的底子,大家介绍本好书吧!
- SPComm编写的DLL,我不知道错什么地方了
- 如何实现下一功能!将数据库中的数据导入或导出?用程序实现!
- <<<<没有好的笑话了,list如何快速清空?delete太慢。
- 关于msado15.dll 的错误?
- 我的郁闷【原创】
- 哪位能推荐个免费或开源的录音组件啊?有Active Audio Record的注册码或注册机也可以啊
=======================================for循环还是for循环Delphi的For循环还是你想的那个For循环只是在for语句终止后,i值处于未定义状态Delphi就是这么规定的这有啥可郁闷的......
1、After the for statement terminates (provided this was not forced by a break or an exit procedure), the value of counter is undefined.”。这句话我不知道是仅仅对于前面说的根本没有进行循环的情况,还是说所有的循环正常退出的情况。但是我的测试表明,如果delphi的循环至少执行了一次,那么正常跳出后I的值是确定的,就是finalvalue+1(对于TO的情况)。
2、C++系列的变量声明可以在循环内部:
for (int i=0;i<5;i++);
这样很好理解,I的作用域本来就是这个FOR循环,任何变量出了作用域都是未定义的。
但delphi的变量是必须是前置声明的,作用域包含整个过程,整个FOR循环都处在其中。因此不应该存在出来循环就没有意义的说法。
和DELPHI相等价的C++的写法应该是
int i;
for(i=0;i<5;i++);
前面说过,这样I的值可是确定的。也就是C++的I值是不是确定,是由使用者确定的。
3、在实际应用中,也经常需要用到FOR跳出后的I值,主要用来对付是不是BREAK跳出的情况。
比如对一个LIST进行有序插入:
似乎应该这样写:
for I:=0 to list.Count-1 do
begin
if xxx then
break;
end;
insert(I,X);
但是因为FOR不执行时I值不确定的问题,上面的代码改为:
for I:=0 to list.Count-1 do
begin
if xxx then
goto final;
end;
I := list.Count;
final:
insert(I,X);
两位觉得是不是别扭?
那么人家C++的就没有代码优化了?
代码优化最基本的原则是保证结果的正确,保证语意不被改变吧?
我前面说了,FOR的语意应该是
1.赋初值
2.判断
3.执行循环体
4.增量
5.到2按照这个语意,1,2是一定要执行的(不执行也行,但要保证结果的正确)。但是现在的情况是,经过所谓的优化以后,某些条件下,1,2根本不执行,结果也是无法预测的,这能够说是成功的优化吗?
而是由于优化的时候i根本没有被分配空间,而是使用寄存器(在当前的实现中,一般使用EAX)。
为了得到你要的效果,可以关闭优化,或者使用全局变量(会有一个警告)。
与C/C++中的for等价的是while do循环,与C/C++中do while等效的是repeat until循环。
先了解语言的特性,否则生搬硬套是要出问题滴。:)
标题中应该是
for I := 0 to getcount -1 do
写漏了