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搞垮一个大软件(借用:“一粒老鼠屎,坏了一锅汤”)
作者:涵曦(www.hanxi.cc)
出处:hanxi.cnblogs.com
GitHub:github.com/hanxi
Email:im.hanxi@gmail.com
文章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
《 Skynet 游戏服务器开发实战》
-
学习地址:
-
优惠推荐码:
2CZ2UA5u
-
可以先免费试学前 2 章内容