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搞垮一個大軟件(借用:“一粒老鼠屎,壞了一鍋湯”)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM