エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

bool型の値を比較する

今日始めて知りました。次の結果はどうなるか?

std::cout << (static_cast<bool>(1) == static_cast<bool>(2)) << std::endl;

C++のbool型は整数型なのでこの結果は0(偽)になると思っていたのですが、正解は1(真)。我ながら予想以上のショック。bool型専用の比較演算子が定義されているんですね。

Pascal(Delphi)では次の結果はFALSEになるので、そのつもりのまま来てしまっていたのかもしれません。

Writeln(Boolean(1) = Boolean(2))

他にも演算子が定義されているんだろうか?と、次の演算も試してみました。

std::cout << (static_cast<bool>(1) ^ static_cast<bool>(2)) << std::endl;

果たして、結果は0。なんと、排他的論理和も定義されているのか!?
…と思ったのも束の間。落ち着いて次のようにしてみると。

std::cout << typeid(static_cast<bool>(1) ^ static_cast<bool>(2)).name() << std::endl;

表示されたのはint型。つまり、それぞれのbool型の値がint型の値に変換され、それのxorをとった結果が表示されただけでした。ふたたび罠にはまるところでした。
でもこのbool型の演算も、組み込みの型だから有効なのであって、C/C++の両方で有効なようにとtypedef int Bool;とか定義して、この定義した型を使うように指定された時点で一発で破綻。
結論。bool型の比較は要注意ということで。