while循环和for循环的区别酿成的Bug

  由于我的粗心大意,犯了个不该犯的错误,幸好经过调试找到了Bug。

大伙都了解:for循环一般在

for(;;这里)

{

......

}

写那个叠加变量(迭代器)的。而while循环一般在

while()

{

...

这里;

}

写叠加变量的。我犯的错误就是for循环在两个地方都写了叠加变量,结果你懂的。

  大家看看下面的代码:

 1 void Func(void)
 2 {
 3     vector<Boat*>::iterator it_Boat = m_pBoats.begin();
 4     vector<Claw*>::iterator it_Claw = m_pClaws.begin();
 5     while (it_Boat != m_pBoats.end())
 6     {
 7         (*it_Boat++)->Draw();
 8         (*it_Claw++)->Draw();
 9     }
10 
11     for (vector<Treasure*>::iterator it = m_pTreasures.begin();
12         it != m_pTreasures.end(); it++)
13     {
14         (*it++)->Draw();
15     }
16 }

大家也许也一眼看到了错误所在,大家看到第12行和第14行。两个地方都用了it++,这不就是it+=2了吗?对啊,我犯这个错误时由于下面的写的时候是copy上面的while循环的。这下好了,忘记删除it++了。结果导致了严重的错误。当时调试到这里时我还没发现有两个it++(郁闷吧!^-^)。改正后的代码:

 1 void Func(void)
 2 {
 3     vector<Boat*>::iterator it_Boat = m_pBoats.begin();
 4     vector<Claw*>::iterator it_Claw = m_pClaws.begin();
 5     while (it_Boat != m_pBoats.end())
 6     {
 7         (*it_Boat++)->Draw();
 8         (*it_Claw++)->Draw();
 9     }
10 
11     for (vector<Treasure*>::iterator it = m_pTreasures.begin();
12         it != m_pTreasures.end(); it++)
13     {
14         (*it)->Draw();
15     }
16 }

 

我开始是这样改的:

 1 void Func(void)
 2 {
 3     vector<Boat*>::iterator it_Boat = m_pBoats.begin();
 4     vector<Claw*>::iterator it_Claw = m_pClaws.begin();
 5     while (it_Boat != m_pBoats.end())
 6     {
 7         (*it_Boat++)->Draw();
 8         (*it_Claw++)->Draw();
 9     }
10 
11     for (int i=0; i<10; i++)
12     {
13         m_pTreasures[i]->Draw();
14     }
15 }

我没发现有两个it++,我这样修改后程序正常运行。我就以为是vs对stl支持的问题了(这种想法都有了,上吊吧我)。我想了想,其他地方也有上面的迭代器的for循环啊,也没错啊。所以我在仔细看看代码。结果就找到了两个it++。再然后就修改好了。再然后就没有然后了。程序就结束了。

  我发表这篇文章有两个意图:

<1> 给自己一个警醒,不要犯同样的错误

<2> 给看这篇文章的网友们一个建议

  上个月在参加培训的时候,听到老师讲到了一句话:“代码相似的时候尽量copy代码”。这句话我记住了,一是减少重复输入,二是减少书写错误的变量名。结果导致我这个问题发生了。我给网友们的建议是:“代码相似的时候也尽量copy代码,但是注意while循环和for循环”。同样的也许还会有其他的地方需要注意不能乱copy的。所以,copy代码时一定得仔细点。谢谢你花时间看到这里。有意见请评论。一个小Bug搞垮一个大软件(借用:“一粒老鼠屎,坏了一锅汤”)

posted @ 2012-07-29 20:28  涵曦  阅读(6762)  评论(15编辑  收藏  举报