for带来的重复遍历

来源:互联网 发布:java经纬度转换度分秒 编辑:程序博客网 时间:2024/06/03 07:12

最近在调试一份代码时,遇到了类似了代码:

#include <iostream>   using namespace std;int main(){    int cnt = 0;    while(1)    {           int idx = 0;        for( ; cnt < 20; ++cnt )        {            cout << "cnt = " << cnt << endl;            if( ++idx >= 5 )            {                break;            }        }        if( cnt >= 20 )            break;    }       return 0;}

上面的代码看上去没有任何问题。实际for相当于do{}while结构,如下所示:

#include <iostream>   using namespace std;int main(){    int cnt = 0;    while(1)    {           int idx = 0;#if 1        do{             if( cnt >= 20 )            {                   break;            }               cout << "cnt = " << cnt << endl;            if( ++idx >= 5 )             {                   break;            }               ++cnt;        }while(1);#else        for( ; cnt < 20; ++cnt )        {            cout << "cnt = " << cnt << endl;            if( ++idx >= 5 )            {                break;            }        }#endif        if( cnt >= 20 )            break;    }       return 0;}


代码中的两个循环是等效的。转换后,问题就比较容易看出来了。当cnt=4时,++idx后会进入break,但cnt并没有加1,下次再进入循环时cnt仍为4,这样就会导致cnt=4输出两次。


例子中只是输出一个数,但在实际项目中如果能类似代码遍历数组或链表,会现出某些节点被重复遍历。

0 0
原创粉丝点击