こんにちは、ナナです。
C++はC言語を拡張した言語です。その拡張された機能の中に新しいデータ型である「bool型」が加わりました。
「bool型」は「true」と「false」の2値を管理するためのデータ型であり、「Yes or No」「On or Off」のようなフラグ管理を行う時にも利用されます。
C言語には「bool型」がないため別のデータ型でフラグ管理をしますが、C++では正式なデータ型として採用されました。
C++で追加された「bool型」の使い方と特徴
C++の新しい組み込みデータ型である「bool型」の定義方法と使い方を、まずは紹介しましょう。
bool型の変数定義と使い方
bool型の変数は次のように定義します。
#include <stdio.h>
int main()
{
bool flg = true;
if (flg == false)
{
printf("false");
}
else
{
printf("true");
}
return 0;
}
bool型に設定する値は次の2つです。
設定値 | 値 | 説明 |
---|---|---|
true | 1 | 「真」であることを示す |
false | 0 | 「偽」であることを示す |
「bool」「true」「false」というキーワードは、C++では予約語となっているため、これらのキーワードを変数名や関数名といったシンボルで利用することはできません。
bool型のメモリサイズは1バイト
bool型のデータは「0」か「1」を表すため、本来であれば1ビットの記憶領域があれば表現が可能です。
しかし、メモリというものの最小使用単位は1バイトであるため、Visual Studioにおける「bool型」のメモリサイズは1バイトとなっています。
#include <stdio.h>
int main()
{
printf("bool型 size:%d", sizeof(bool));
return 0;
}
bool型 size:1
ただし、「bool型」のメモリサイズは実装依存とされており、異なる開発環境によっては別サイズである可能性があります。
1バイトは256種類の数を管理することができるサイズです。bool型変数に「true」「false」以外の数を入れたらどうなるのでしょうね?
後ほど、検証してみましょう。
C++における比較演算子の結果は「bool型」であるということ
真偽値が利用されるシーンと言えば、if文やwhile文の条件式です。その条件式は、比較演算子が利用されますよね。
#include <stdio.h>
int main()
{
int num = 10;
if (num == 100)
{
printf("%d", num);
}
return 0;
}
C++において比較演算子の比較結果は「bool型」として出力されます。
Visual Studioでは、デバッガを利用してデータ型を確かめることができます。ウォッチウィンドウを利用しましょう。
このように比較演算子の結果は「bool型」として出力されていることがデバッガでも確認できます。
ここで注意すべきことはif文やwhile文における条件式の「真偽値」と、bool型の管理する真偽値の扱いの違いです。
項目 | 真の表現 | 偽の表現 |
---|---|---|
if文などの条件式 | 0以外 | 0 |
bool型 | true(1) | false(0) |
「偽」に関しては同じですが、「真」の表現は異なるということです。
bool型は「true」「false」以外の数値をどう扱うか?
bool型は1バイトのデータサイズであることはわかりました。それでは「true」「false」以外の値を代入するとどのようになるのか実験してみましょう。
bool型の変数に「true」「false」以外のデータを入れてみる
それでは、bool型変数へ「10」と「-10」の値を入れて確認してみましょう。
#include <stdio.h>
int main()
{
bool flg = false;
flg = 10;
printf("flg:%d\n", flg);
flg = -10;
printf("flg:%d\n", flg);
return 0;
}
flg:1
flg:1
不思議なことに、flg変数の値は共に「1」と表示されましたね。つまり、「ture」を表現していることになります。
「bool型」特有のルールが適用されていそうなのがわかりますね。次は、このルールを深く掘り下げて検証してみますよ。
整数型と浮動小数点型をbool型へキャストした結果一覧
次のプログラムを動かして、bool型に対する数値変換がどのような法則があるかを調べてみます。
#include <stdio.h>
int main()
{
printf("整数型\n");
printf(" 100 => %d\n", (bool)100);
printf(" 10 => %d\n", (bool)10);
printf(" 1 => %d\n", (bool)1);
printf(" 0 => %d\n", (bool)0);
printf(" -1 => %d\n", (bool)-1);
printf(" -10 => %d\n", (bool)-10);
printf("-100 => %d\n", (bool)-100);
printf("\n");
printf("浮動小数点型\n");
printf(" 100.5 => %d\n", (bool)100.5);
printf(" 10.5 => %d\n", (bool)10.5);
printf(" 1.5 => %d\n", (bool)1.5);
printf(" 1.0 => %d\n", (bool)1.0);
printf(" 0.0 => %d\n", (bool)0.0);
printf(" -1.5 => %d\n", (bool)-1.5);
printf(" -10.5 => %d\n", (bool)-10.5);
printf("-100.5 => %d\n", (bool)-100.5);
return 0;
}
整数型
100 => 1
10 => 1
1 => 1
0 => 0
-1 => 1
-10 => 1
-100 => 1
浮動小数点型
100.5 => 1
10.5 => 1
1.5 => 1
1.0 => 1
0.0 => 0
-1.5 => 1
-10.5 => 1
-100.5 => 1
このように、「0」や「0.0」は「false」を表す「0」に変換され、それ以外の値は全て「true」を表す「1」へ変換されているのがわかります。
bool型の変数は1バイトのメモリではあるものの、型変換の仕組みにより強制的に「true(1)」「false(0)」の値へと変換され格納されることになります。