この変換は移植性があります。両方のアサーションに合格したことを確認できますか?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
理由を聞かないでください。私はそれがいことを知っています。ありがとうございました。
int x = 4<5;
完全にポータブル。標準準拠。 bool
からint
への変換は暗黙的です!
C++標準の§4.7/ 4は(IntegralConversion)と言います
ソースタイプがboolの場合、値
false
はゼロに変換されますおよび値true
は1に変換されます。
Cに関しては、私が知る限り、Cにはbool
がありません(1999年以前)。したがって、bool
からint
への変換は、C++にのみ関連します。 Cでは、4<5
はint
値に評価されます。この場合、値は1
であり、4>5
は0
に評価されます。
編集:コメントのジェンズは、C99は_Bool
型を持っていると述べました。 bool
は、stdbool.h
ヘッダーファイルで定義されているマクロです。 true
とfalse
もstdbool.h
で定義されているマクロです。
C99の§7.16によると、
マクロ
bool
は_Boolに展開されます。[..]
true
整数定数に展開1
、false
整数定数に展開0
、 [..]
質問[C]と[C++]に同時にタグを付けました。結果は言語間で一貫していますが、回答の構造はこれらの言語ごとに異なります。
C言語では、例はbool
とは関係ありません(C99にも当てはまります)。 C言語では、関係演算子はbool
の結果を生成しません。 4 > 5
と4 < 5
は両方とも、0
または1
の値を持つint
型の結果を生成する式です。したがって、Cの例では、「boolからintへの変換」は行われません。
C++では、リレーショナル演算子は実際にbool
の結果を生成します。 bool
値はint
型に変換可能で、true
は1
に、false
は0
に変換されます。これは言語によって保証されています。
追伸C言語には専用のブール型_Bool
(マクロエイリアスbool
)もあり、その統合変換規則は基本的にC++と同じです。ただし、これはCの特定の例には関係ありません。繰り返しますが、Cの関係演算子は、言語仕様のバージョンに関係なく、常にint
(bool
ではありません)の結果を生成します。
C標準のセクション6.5.8.6には次のように記載されています。
演算子<(より小さい)、>(より大きい)、<=(より小さいまたは等しい)、および> =(より大きいまたは等しい)の各演算子は、指定された関係が真の場合1を返し、そうである場合0を生成します。 false。)結果の型はintです。
Int boolキャストは暗黙的に行われるため、問題はないようです。これは、Microsoft Visual C++、GCC、Intel C++コンパイラで動作します。 CまたはC++のどちらでも問題ありません。