web-dev-qa-db-ja.com

boolからintへの変換

この変換は移植性があります。両方のアサーションに合格したことを確認できますか?

int x = 4<5;
assert(x==1);

x = 4>5;
assert(x==0);

理由を聞かないでください。私はそれがいことを知っています。ありがとうございました。

114
pic11
int x = 4<5;

完全にポータブル。標準準拠。 boolからintへの変換は暗黙的です!

C++標準の§4.7/ 4は(IntegralConversion)と言います

ソースタイプがboolの場合、値falseはゼロに変換されますおよび値trueは1に変換されます


Cに関しては、私が知る限り、Cにはboolがありません(1999年以前)。したがって、boolからintへの変換は、C++にのみ関連します。 Cでは、4<5int値に評価されます。この場合、値は1であり、4>50に評価されます。

編集:コメントのジェンズは、C99は_Bool型を持っていると述べました。 boolは、stdbool.hヘッダーファイルで定義されているマクロです。 truefalsestdbool.hで定義されているマクロです。

C99の§7.16によると、

マクロboolは_Boolに展開されます。

[..] true整数定数に展開1false整数定数に展開0、 [..]

179
Nawaz

質問[C]と[C++]に同時にタグを付けました。結果は言語間で一貫していますが、回答の構造はこれらの言語ごとに異なります。

C言語では、例はboolとは関係ありません(C99にも当てはまります)。 C言語では、関係演算子はboolの結果を生成しません。 4 > 54 < 5は両方とも、0または1の値を持つint型の結果を生成する式です。したがって、Cの例では、「boolからintへの変換」は行われません。

C++では、リレーショナル演算子は実際にboolの結果を生成します。 bool値はint型に変換可能で、true1に、false0に変換されます。これは言語によって保証されています。

追伸C言語には専用のブール型_Bool(マクロエイリアスbool)もあり、その統合変換規則は基本的にC++と同じです。ただし、これはCの特定の例には関係ありません。繰り返しますが、Cの関係演算子は、言語仕様のバージョンに関係なく、常にintboolではありません)の結果を生成します。

46
AnT

C標準のセクション6.5.8.6には次のように記載されています。

演算子<(より小さい)、>(より大きい)、<=(より小さいまたは等しい)、および> =(より大きいまたは等しい)の各演算子は、指定された関係が真の場合1を返し、そうである場合0を生成します。 false。)結果の型はintです。

17
user97370

Int boolキャストは暗黙的に行われるため、問題はないようです。これは、Microsoft Visual C++、GCC、Intel C++コンパイラで動作します。 CまたはC++のどちらでも問題ありません。

2
Alex James