を返します2。
「通常の算術変換」は、演算子のオペランドに適用されます==。は、または_Boolの変換ランクよりも低い変換ランクを持つ符号なしタイプです。intunsigned int
「通常の算術変換」は、 C99またはC11標準のセクション6.3.1.8「通常の算術変換」で指定されています(リンクは最近のドラフトへのリンクです)。
では、浮動小数点オペランドがないため、「整数拡張」が両方のオペランドに適用され、右のオペランドをからにi == b昇格して値を生成します。現在、両方のオペランドは同じタイプであるため、それ以上の変換は必要ありません。したがって、はfalseと同等です。_Boolint1i == b42 == 1
では(_Bool)i == b、「整数拡張」は引き続き両方のオペランドに適用されるため、両方がからに変換さ_Boolれintます。(からintへの変換とへの変換は情報_Boolをint失い、ゼロ以外のすべての値をに変換します1。)これで、両方のオペランドが同じタイプになるため、それ以上の変換は必要ありません。したがって、はtrue(_Bool)i == bと同等であり、関数は。を返します。1 == 12
(注:標準を読む際の不注意により、これはこの回答の3番目の主要な編集についてです。今回は正しいと思います。)
コメント内の質問に答えて、からにb == 42u昇格し、対の比較になります。オペランドの符号は異なりますが、変換ランクは同じであるため、符号付きオペランドは符号なし型に変換されます。からへの変換は簡単で、を生成します。したがって、比較はと同等であり、これは誤りです。b_Boolintintunsigned int1intunsigned int1u1u == 42u
==( Cの演算子は、他の等式演算子や関係演算子と同様に、型の結果ではなくint、値0or1を使用した型の結果を生成することに注意してください。)_Bool