web-dev-qa-db-ja.com

C ++でのブールデータ型の比較

boolデータ型は通常、0falseとして)および1trueとして)として表されます。ただし、true値は1以外の値で表すことができると言う人もいます。後のステートメントがtrueの場合、次の式は正しくない可能性があります。

bool x = 1;
if (x==1)
    Do something..

次のステートメントは、一般的に使用されるコンパイラで期待どおりに機能するかどうか疑問に思っています。

  1. bool x = 1;
    if (x==1)
        Do something.
    
  2. bool y = 0;
    if (y>0.5)
        Do something..
    
  3. bool z = 1;
    if(z>0.5)
        Do something...
    
16
rezabakhsh

§4.5の C++標準 は次のように述べています:

Bool型の右辺値は、int型の右辺値に変換でき、falseはゼロになり、trueは1になります。

2と3に関しては、型変換が行われるため、ステートメントは期待どおりに機能します

14
akib khan

ブール変換 のルールに従って:

整数型、浮動小数点型、スコープ外の列挙型、ポインター型、およびメンバーへのポインター型の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にプロモートされ、次に converteddouble for comparison ;

オペランドが算術型または列挙型(スコープ付きまたはスコープなし)の場合、通常の算術変換は、算術演算子の規則に従って両方のオペランドに対して実行されます。値は変換後に比較されます。

そして

算術演算子に渡されるオペランドが整数型またはスコープなしの列挙型である場合、他のアクションの前(ただし、該当する場合は左辺値から右辺値への変換後)に、オペランドは整数に昇格します。

...

  • それ以外の場合、一方のオペランドがdoubleであれば、もう一方のオペランドはdoubleに変換されます

次に_y>0.5_はfalseです。

3番目のケースでは、if (z>0.5)zが値_1_でintにプロモートされ、次に converteddouble for comparison ;次に_z>0.5_はtrueです。

9
songyuanyao

if (x==1)は正しくあります。ブール値を数値型に変換すると、すべての真の値の表現が1に変換されます。

_bool z=true_を指定すると、1.0は0.5より大きいため、if(z>0.5)はtrueになります。

6
eerorika

boolには2つの値しかなく、それらはtruefalseです。 10は整数リテラルであるため、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に変換されます。

これを念頭に置いて、すべての例は期待どおりに動作します。ただし、boolsの主な目的は、0および1の特別な意味として数値を指定する代わりに、コードでtrueおよびfalseを使用できることです。明示的にする方が常に良いので、trueを意味する場合は、1ではなくtrueと書く方がよいでしょう。

4