20

C ++または<stdbool.h>C99から、<ブール値に対して小なり演算子はどのように定義されますか?

または、このコードの動作を説明します。

#ifndef __cplusplus
#include <stdbool.h>
#endif
#include <stdio.h>

int main() {
    bool b = -1;
    if(b < true) {
        printf("b < true\n");
    }
    if(b < false) {
        printf("b < false\n");
    }
    if(true < false) {
        printf("true < false\n");
    }
    if(false < true) {
        printf("false < true\n");
    }
}

MSVCバージョン10では、C ++コードとしてコンパイルされ、GCC 4.6.3-ubuntu5はCコードとしてコンパイルされ、G++4.6.3-1ubuntu5はC++コードとしてコンパイルされます。

false < true

つまり、次の不等式はすべてfalseです:

(bool)-1 < true
(bool)-1 < false
true < false

そして、以下はtrue

false < true
4

7 に答える 7

20

C ++では(そして私はCでもそうだと思いますが)、 sはあたかもそうであったかのようにbool正確に比較し ます。また、タイプが、の場合、および以外の値は使用できません。false0true1booltruefalse

bool他の数値タイプと比較すると、に変換されint、再びに変換falseされます。0true1

編集: C ++とstdbool.hC99の両方で、ブール値を0(false)または1(true)のいずれかに強制します-bool b = -1;の値bを1に設定します。1 < 11 < 0は両方ともfalseであるため、質問の不等式は正しいです。

編集:(ジェームズによる)上記の編集が実際には正しくないことを除いて、少なくともC++では。Aboolの値は0または1ではなく、値はfalseまたはtrueです。int変換によってとの値が作成0されるのは、にプロモートされたときだけ1です。

そして、コンラッドが指摘したように、bool価値観の比較はありません。「通常の算術変換」は、比較演算子に対して発生します。これは、両方のオペランドの汎整数拡張を意味します。これは 、 (または...または列挙型のように)bool変換することを意味します。intcharshort

これらはすべてかなり技術的です。false実際には、 <を覚えている か、 0と1のどちらかが最適であるとtrue考えることができます。覚えておくべき唯一の重要なことは、aは他の値を持つことができないということです。falsetruebool

bool(興味深いことに、aのビットパターンが標準によって課されている とは思いません。実装ではビットパターン0x55を使用できます。0xAAたとえば、整数型へのすべての変換で0と1が得られる限り、bool常に適切な値など。静的変数のゼロ初期化を含みます。)

そして最後の注意:にbool b = -1;設定bします-1 != 0(これは true、ではありません1が、もちろん、任意の数値コンテキストでtrueに変換されます。1

于 2012-08-14T12:04:11.780 に答える
5

これは完全に理にかなっています。積分型=>ブール変換は効果的にb = i != 0です。比較を行うために、<false=>0およびtrue=>1のルールによってboolをintに昇格させます。最初のケース-1ではtrueに等しく、両方とも1に昇格するため、falseになります。明らかに、2番目と3番目のケースでは1が0を下回ることはありませんが0 < 1、最後のケースでは1です。

于 2012-08-14T12:04:04.193 に答える
2

演算子>および<これに基づく:

true == (1)
false == (0)

this false:(bool)-1 <true(bool)-1 <false(bool b = -1でのローリング演算のため);

于 2012-08-14T12:02:44.663 に答える
2

boolは(符号付き)整数型として定義されているようです。falseは0、0は1です。これがtrue> false(1> 0)がtrueである理由を説明しています。

また、-1を符号なしの数値と比較すると、-1が符号なしにキャストされ、プラットフォームでは整数のオーバーフローが発生し、UINT_MAX(またはboolが型変換されたタイプ)になります。これで、次の式が誤っていた理由が説明されます。

((bool)-1) < true i. e. UINT_MAX < 1
((bool)-1) < false i. e. UINT_MAX < 0
true < false i. e. 1 < 0
于 2012-08-14T12:03:04.460 に答える
2

C++の場合はfalse<true

Cの場合は答えるのがより難しいです。そうか

typedef char _Bool; /* For C compilers without _Bool */ 私のstdbool.hで

コンパイラがサポートしている場合_BoolはC++と同じように機能し、自動的に0/1に変換されるようですが、そうでない場合はcharとして機能するはずでありb < trueb < falsecharが署名されている場合はそうなります

私にとって(int)(bool)-1はCでも1なので、boolcharではないと定義されます

于 2012-08-14T12:04:17.483 に答える
2

ブール値は、。falseよりも小さくなるように順序付けられますtrue。標準によれば、aboolは2つの値のみを保持できます:truefalse、したがって、の変換は生成される(bool)-1はずtrueです(boolに変換されたときのすべての非0値はtrue)。これがclangとg++-4.7の動作です。

実際の比較(私は信じています)はint、がプロモートされた後に行われboolます。テストしたコンパイラは、boolによる変換の中間ステップを回避し、実際の値をプロモートしたようboolです。

于 2012-08-14T12:04:49.417 に答える
1

ここに説明がありますが、私は標準をチェックしていません。あなたの実験から、「<」演算子はブール値に対して定義されていないようです。比較されるのは、ブール値が変換されるunsignedintです。理論的には、標準がすべての「真の」ブール値が同じ値に変換されることを保証しない可能性があります。そして、-1は最大のunsignedintに変換されます。

別の実験として、次のコード

#include <iostream>

int main()
{
std::cout<< (((bool)1) == true) << "\n";
std::cout<< (((bool)2) == true) << "\n";
std::cout<< (((bool)0) == false) << "\n";
std::cout<< (((bool)1) == false) << "\n";
  return 0;
}

1 110を出力します

したがって、ゼロ以外の値はすべて「真」です。

于 2012-08-14T12:12:45.803 に答える