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