C++很多人快写的bug

· · 个人记录

很多人的快写:

template<typename T>
void writeT(T x){
    if(x<0) putchar('-'),x=-x;
    if(x>9) writeT(x/10);
    putchar(x%10+'0');return;
}

void write(int x){
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}

但是输出INT_MIN、LONG_LONG_MIN时就会发生这样的问题:

\colorbox{black}{\color{white}\texttt{-(}}

简直要 : - (了

为什么呢?

(以 \texttt{LONG\ LONG} 举例)因为 \texttt{LONG\_LONG\_MIN}=-9223372036854775808,而 \texttt{LONG\_LONG\_MAX}=9223372036854775807(因为还有 0,所以少了个1\texttt{-LONG\_LONG\_MIN} 超出了 \texttt{LONG\ LONG} 范围,因此会发生这样的问题。

所以代码要这样写:

template<typename T>
void write(T x){
    if(x<0){
        cout<<'-';
        if(x<-9){
            write(-(x/10));
        }
        putchar(-(x%10)+'0');
    }else if(x>=0&&x<=9){
        putchar(x+'0');
    }else{
        write(x/10);
        putchar(x%10+'0');
    }
}

感谢 yukimianyan 发现我输出-1时有bug

原代码:

template<typename T>
void write(T x){
    if(x<0){
        cout<<'-';
        write(-(x/10));
        putchar(-(x%10)+'0');
    }else if(x>=0&&x<=9){
        putchar(x+'0');
    }else{
        write(x/10);
        putchar(x%10+'0');
    }
}