2009年11月10日火曜日

4.29497e+09 in C++

 C++ でプログラムを書いていて、がっかりなバグに出会った。
int main(int argc, char**argv){
#define LOG(X) std::cout << #X << ":" << X << ", " << typeid(X).name() << std::endl
    LOG(-1U);
    LOG(int(-1U));
    LOG(float(-1U));

    std::vector vi(1);
    float a = -vi.size();
    LOG(a); // -1 expected !!!
}
出力:

-1U:4294967295, j
int(-1U):-1, i
float(-1U):4.29497e+09, f
a:4.29497e+09, f
float a = -vi.size(); なんてコードを、なんの疑いもなく書いてしまった。しかも、-1 になることを期待して。僕の頭の中では int operator - (unsigned int); だと思っていた。

int a = -vi.size(); は -1 になる。きっと、こういうコードが結果的に期待する結果になるせいで単項-演算子の型を勘違いして覚えてしまったのだろう、、、。

そんな訳で、4.29497e+09 は覚えておいて損はない値。(かもしれない)

0 件のコメント:

コメントを投稿