8

C でブール値をエミュレートするには、次のようにします。

int success;
success = (errors == 0 && count > 0);
if(success)
   ...

以下をstdbool.h含めると、次のことが可能になります。

bool success;
success = (errors == 0 && count > 0) ? true : false;
if(success)
   ...

私が理解していることから、論理演算子と比較演算子は 1 または 0 を返すstdbool.h必要があります。また、定数はtrue == 1and false == 0.

したがって、次のように動作するはずです。

bool success;
success = (errors == 0 && count > 0);
if(success)
   ...

そして、私がテストしたコンパイラで動作します。しかし、それが移植可能なコードであると仮定しても安全でしょうか? (存在すると仮定stdbool.h)

bool は内部型であるため、C++ コンパイラでは状況が異なりますか?

4

3 に答える 3

15

と仮定しても安全です。C99 では、_Bool型への変換時に、ゼロ以外の値はすべて 1 に変換されます。これについては、C99 標準のセクション 6.3.1.2 で説明されています。等値演算子と関係演算子 ( ==>=など) も 1 または 0 になることが保証されています。これについては、セクション 6.5.8 および 6.5.9 で説明します。

C++ の場合、bool型は値が1 または 0 ではなくtrueorに変換される実際のブール型ですが、関係演算子と比較演算子が使用されるため、演算などの結果を aに割り当てて、それが機能することを期待しても安全です。とにかく結果を出します。が整数型に変換されると、1 に変換されます。false==boolbooltrue

于 2013-02-01T08:17:17.603 に答える
3

(errors == 0 && count > 0)には typeがあり、 type の変数への代入や条件での使用など、boola が必要な場所ならどこでも使用できます。(別の整数型に変換すると、0 と1 に変換されますが、コードでは問題ありません。)boolboolfalsetrue

<stdbool.h>C では、 with は、 C++ とまったく同じように動作することになっていることに注意してくださいbool(ただし、さまざまな歴史的な理由から、実際の仕様は異なります)。これは、次のようなことを意味します。

bool success = (errors == 0 && count > 0) ? true : false;

あなたが本当に書きたいものではありません。errors == 0 && count > 0には と互換性のある型があり、型boolの式として使用できます bool。(もちろん、C++ では、型は と互換性があるだけでなく bool、 ですbool。)

于 2013-02-01T08:50:04.750 に答える
1

stdbool.h私のシステムのジューシーな部分は次のとおりです。

#define bool    _Bool
#if __STDC_VERSION__ < 199901L && __GNUC__ < 3
typedef int     _Bool;
#endif

#define false   0
#define true    1

C99 には型_Boolが組み込まれており、ゼロ以外の値はすべて 1 に変換されます (前述のとおり)。ただし、私のstdbool.hショーをざっと見てみると、C99 がなくても、ゼロに等しくない値または_Boolaに割り当てられた値は1 に変換されない_Boolという 1 つの警告を使用して、このようなものが機能すると想定しても安全です(int特別なプロパティを持つ組み込み型ではなく、単純なtypedef ) であるため、そうではありません== true

于 2013-02-01T08:39:10.720 に答える