任意のC++コンパイラに対して(bool)true == (int)1
を想定できますか?
はい。キャストは冗長です。あなたの表現で:
true == 1
インテグラルプロモーションが適用され、bool値はint
にプロモートされ、このプロモーションは1を生成する必要があります。
参照:4.7 [conv.integral]/4:ソースタイプがbool
...の場合、true
は1に変換されます。
チャールズベイリーの答えは正しい。 C++標準の正確な表現は(§4.7/ 4)です:「ソースタイプがboolの場合、値falseはゼロに変換され、値trueは1に変換されます。」
編集:彼も参照を追加しているのがわかります-気が散って忘れないなら、これをすぐに削除します...
Edit2:繰り返しますが、ブール値自体は常に0または1に変換されますが、いくつかの関数(特にC標準ライブラリから)は、「基本的にブール」であるがint
sとして表される値を返す通常は、falseを示すためにゼロまたはtrueを示すためにゼロ以外である必要があります。たとえば、<ctype.h>
のis *関数は、ゼロまたは非ゼロのみを必要とし、必ずしもゼロまたは1である必要はありません。
これをbool
にキャストすると、ゼロはfalseに変換され、ゼロ以外はtrueに変換されます(予想どおり)。
規格によれば、その仮定で安全でなければなりません。 C++ bool
タイプには、true
とfalse
の2つの値があり、対応する値は1と0です。
注意すべき点は、bool
式と変数をBOOL
式と変数と混合することです。後者はFALSE = 0
およびTRUE != FALSE
として定義されます。これは実際には、ほとんどの場合、0以外の値はTRUE
と見なされることを意味します。
最新のコンパイラの多くは、BOOL
の値が0または1以外の場合、bool
からBOOL
に暗黙的にキャストしようとするコードに対して実際に警告を発行します。
私は、異なるコンパイラが異なる結果をtrueで返すことを発見しました。また、boolをintではなくboolと比較すると、ほとんどの場合に優れていることがわかりました。これらのintは、プログラムが進化するにつれて値が時間とともに変化する傾向があり、1をtrueと仮定すると、コードの他の場所で無関係な変更に噛み付く可能性があります。