bool
データ型は通常、0
(false
として)および1
(true
として)として表されます。ただし、true
値は1
以外の値で表すことができると言う人もいます。後のステートメントがtrue
の場合、次の式は正しくない可能性があります。
bool x = 1;
if (x==1)
Do something..
次のステートメントは、一般的に使用されるコンパイラで期待どおりに機能するかどうか疑問に思っています。
bool x = 1;
if (x==1)
Do something.
bool y = 0;
if (y>0.5)
Do something..
bool z = 1;
if(z>0.5)
Do something...
§4.5の C++標準 は次のように述べています:
Bool型の右辺値は、int型の右辺値に変換でき、falseはゼロになり、trueは1になります。
2と3に関しては、型変換が行われるため、ステートメントは期待どおりに機能します
ブール変換 のルールに従って:
整数型、浮動小数点型、スコープ外の列挙型、ポインター型、およびメンバーへのポインター型のprvalueは、
bool
型のprvalueに変換できます。値ゼロ(整数、浮動小数点、およびスコープなし列挙の場合)およびnullポインターとnullポインターからメンバーへの値は
false
になります。他のすべての値はtrue
になります。
その後
_bool x = 1; // x will be true
bool y = 0; // y will be false
bool z = 1; // z will be true
_
1つ目のケースでは、if (x==1)
、x
は プロモート からint
になります。
型
bool
は、値int
が_0
_になり、false
が_1
_になるtrue
に変換できます。
次に_(x==1)
_はtrue
です。
2番目のケースでは、if (y>0.5)
、y
が値_0
_でint
にプロモートされ、次に converted がdouble
for comparison ;
オペランドが算術型または列挙型(スコープ付きまたはスコープなし)の場合、通常の算術変換は、算術演算子の規則に従って両方のオペランドに対して実行されます。値は変換後に比較されます。
そして
算術演算子に渡されるオペランドが整数型またはスコープなしの列挙型である場合、他のアクションの前(ただし、該当する場合は左辺値から右辺値への変換後)に、オペランドは整数に昇格します。
...
- それ以外の場合、一方のオペランドが
double
であれば、もう一方のオペランドはdouble
に変換されます
次に_y>0.5
_はfalse
です。
3番目のケースでは、if (z>0.5)
、z
が値_1
_でint
にプロモートされ、次に converted がdouble
for comparison ;次に_z>0.5
_はtrue
です。
if (x==1)
は正しくあります。ブール値を数値型に変換すると、すべての真の値の表現が1に変換されます。
_bool z=true
_を指定すると、1.0は0.5より大きいため、if(z>0.5)
はtrueになります。
bool
には2つの値しかなく、それらはtrue
とfalse
です。 1
と0
は整数リテラルであるため、bool
に変換できます。変換は両方向で機能することを考慮する必要がありますが、必ずしも同じ整数が返されるとは限りません。
int a = 5;
bool b = a; // int -> bool conversion
int c = b; // bool -> int conversion
std::cout << a << " " c;
プリント:
5 1
0
以外の整数値はtrue
に変換されますが、true
は常に1
に変換されます。
これを念頭に置いて、すべての例は期待どおりに動作します。ただし、bool
sの主な目的は、0
および1
の特別な意味として数値を指定する代わりに、コードでtrue
およびfalse
を使用できることです。明示的にする方が常に良いので、true
を意味する場合は、1
ではなくtrue
と書く方がよいでしょう。