web-dev-qa-db-ja.com

C ++コンパイラで(bool)true ==(int)1と仮定できますか?

任意のC++コンパイラに対して(bool)true == (int)1を想定できますか?

109
Petruza

はい。キャストは冗長です。あなたの表現で:

true == 1

インテグラルプロモーションが適用され、bool値はintにプロモートされ、このプロモーションは1を生成する必要があります。

参照:4.7 [conv.integral]/4:ソースタイプがbool...の場合、trueは1に変換されます。

128
CB Bailey

チャールズベイリーの答えは正しい。 C++標準の正確な表現は(§4.7/ 4)です:「ソースタイプがboolの場合、値falseはゼロに変換され、値trueは1に変換されます。」

編集:彼も参照を追加しているのがわかります-気が散って忘れないなら、これをすぐに削除します...

Edit2:繰り返しますが、ブール値自体は常に0または1に変換されますが、いくつかの関数(特にC標準ライブラリから)は、「基本的にブール」であるがintsとして表される値を返す通常は、falseを示すためにゼロまたはtrueを示すためにゼロ以外である必要があります。たとえば、<ctype.h>のis *関数は、ゼロまたは非ゼロのみを必要とし、必ずしもゼロまたは1である必要はありません。

これをboolにキャストすると、ゼロはfalseに変換され、ゼロ以外はtrueに変換されます(予想どおり)。

18
Jerry Coffin

規格によれば、その仮定で安全でなければなりません。 C++ boolタイプには、truefalseの2つの値があり、対応する値は1と0です。

注意すべき点は、bool式と変数をBOOL式と変数と混合することです。後者はFALSE = 0およびTRUE != FALSEとして定義されます。これは実際には、ほとんどの場合、0以外の値はTRUEと見なされることを意味します。

最新のコンパイラの多くは、BOOLの値が0または1以外の場合、boolからBOOLに暗黙的にキャストしようとするコードに対して実際に警告を発行します。

7
Franci Penov

私は、異なるコンパイラが異なる結果をtrueで返すことを発見しました。また、boolをintではなくboolと比較すると、ほとんどの場合に優れていることがわかりました。これらのintは、プログラムが進化するにつれて値が時間とともに変化する傾向があり、1をtrueと仮定すると、コードの他の場所で無関係な変更に噛み付く可能性があります。

3
Michael Dorgan