zoukankan      html  css  js  c++  java
  • 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搞垮一个大软件(借用:“一粒老鼠屎,坏了一锅汤”)

  • 相关阅读:
    二进制流 最后一段数据是最后一次读取的byte数组没填满造成的
    java中的匿名内部类总结
    决策树构建算法之—C4.5
    Segment公司--整合数据进行分析
    UBuntu安裝使用PIP
    undefined reference to “boost” in Qt—Ubuntu
    Ubuntu14.04引导菜单修复
    ubuntu16.04下编译安装OpenCV
    PCL:Ubuntu下安装配置PCL
    Ubuntu安装配置Python.pyDev
  • 原文地址:https://www.cnblogs.com/hanxi/p/2614257.html
Copyright © 2011-2022 走看看