【C++】bool型やBOOL型をstd::cout/ストリームで出力する方法

coutやストリームでの表示・出力方法に関してですが、組み込み型のbool型とcharベースのBOOL型でそれぞれ異なる方法を用いる必要があります。

bool型

boolalphaマニピュレーターを用いればtrue/false形式での出力が可能になります。デフォルトは1/0形式です。

bool b = true;
cout << b;                     // 1
cout << std::boolalpha   << b; // true
cout << std::noboolalpha << b; // 1

BOOL型

BOOL型がchar型ベースの場合は、int型やbool型へのキャストや条件演算子を用いた明示的な変換が必要になります。

typedef unsigned char BOOL;
#define TRUE  1
#define FALSE 0

BOOL b = TRUE;
cout << b;                     // 何も表示されない
cout << (int)b;                // 1
cout << static_cast<int>(b);   // 1
cout << (b ? "TRUE" : "FALSE"); // TRUE
cout << (b ? 1 : 0);            // 1
cout << !!b;                    // 1
cout << std::boolalpha << (bool)b; // true

BOOL型が表示されない理由

BOOL型を直接出力した場合、 std::coutは値をchar型として出力しようとします。 BOOL型のFALSE/TRUEの値はchar型上では文字コード(0x00/0x01)となりますが、 この領域はナル文字や不可視文字であるため、出力時にはなにも表示されていないように見えてしまいます。

BOOL b = TRUE;
cout << b; // "" // なにも表示されない

開発環境によっては独自定義のBOOL型が使われている所も多いため、注意が必要です。 特にApple(iOS/macOS)のObjective-C環境では実際にBOOL型(YES/NO)がchar型の別名として定義されています。

typedef signed char BOOL;
#define YES ((BOOL)1)
#define NO  ((BOOL)0)

ちなみにMicrosoftのWindows環境でも#include <windows.h>によるBOOL型(TRUE/FALSE)が使用出来ますが、こちらは歴史的にint型の別名として定義されていたため、今回のような問題は起こりません。

広告