一个短路求值引起的一个小bug

今天在写一个判断字符串是否回文时因为短路求值问题导致了一个bug,记录如下:

 

代码如下

bool isPal(char str[],int len)
{
    int begin=0;
    int end=len-1;
    bool result=true;
    cout<<str<<endl;
    while(begin<end)
    {
        result=result&&(str[begin++]==str[end--]);
    }
    cout<<"after "<<str<<endl;
    return result;
}

运行时发现,在str[]的长度为4时,程序长时间运行而无结果,最后定位到是该函数引起。

str[]="1000"时,begin=0,end=3

result=result&&(str[begin++]==str[end--]);该句执行完毕后,begin=1;end=2;result=false

再次循环时,短路求值,使得begin++与end--不会再被执行,因而无法退出循环。

改为result=(str[begin++]==str[end--])&&result;

或while(begin<end && result)//这种更好,避免了后续的无谓的比较

 

-------------

写代码这么多年了,竟然还是会犯这种错误。。。 

 

posted @ 2014-07-08 16:57  郑理  阅读(525)  评论(2编辑  收藏  举报