[C言語入門] 演算子の使い方(15)
高木です。おはようございます。
この連載もいよいよ終盤に入っています。
何とか年内には完結させたいものです。
今回は「条件演算子」、次回は「代入演算子」、そして最終回が「コンマ演算子」を予定しています。
前置きは最小限にして、早速本題に入ることにしましょう。
条件演算子
条件演算子は、Cでは唯一の三項演算子です。
そのためか、「三項演算子」という呼称が使われることも多いようです。
しかし、正しい名前は「条件演算子(conditional operator)」ですので注意してください。
条件演算子は次の形式で表されます。
第1オペランド ? 第2オペランド : 第3オペランド
まずは大まかに機能を説明することにしましょう。
第1オペランドを評価した結果が真(ゼロ以外)の場合、第2オペランドが評価され式の評価結果になります。
第1オペランドを評価した結果が偽(ゼロ)の場合、第3オペランドが評価され式の評価結果になります。
条件演算子の代わりにif文を使うことができるケースもそれなりにありますが、どうしても式を書かなければならない文脈では条件演算子を使わざるを得ません。
そうでなければ、if文を使うためにわざわざ関数を定義しなければならなくなります。
第1オペランドはスカラ型、すなわち算術型かポインタ型でなければなりません。
第1オペランドの評価直後は「副作用完了点(sequence point)」になります。
第2オペランドと第3オペランドの型は、ごく大雑把にいえば、同じ型であるか、同じ型に暗黙的に変換できる型でなければなりません。
正確には次のいずれかの条件を満たさなければなりません。
- 両方のオペランドがともに算術型である。
- 両方のオペランドが同じ構造体型または共用体型である。
- 両方のオペランドの型がvoid型である。
- 両方のオペランドが適合する型の修飾版または非修飾版へのポインタ型である。
- 一方のオペランドがポインタ型であり、他方のオペランドが空ポインタ定数である。
- 一方のオペランドがオブジェクト型または不完全型へのポインタ型であり、他方のオペランドがvoid型の修飾版または非修飾版へのポインタ型である。
評価結果の型は、第2および第3オペランドの型の組み合わせによって決まります。
第2および第3オペランドが算術型であれば、「通常の算術型変換」を行った型が評価結果の型になります。
第2および第3オペランドが構造体型または共用体型であれば、評価結果も同じ構造体型または共用体型になります。
第2および第3オペランドがvoid型であれば、評価結果の型もvoid型になります。
第2および第3オペランドがポインタ型の場合、両方のオペランドの型を合成し、かつオペランドが持つすべての修飾子を適用したポインタ型になります。
一方が空ポインタ定数の場合、他方のオペランドの型が評価結果の型になります。
第2、第3オペランドに関するルールは複雑ですが、常識的に考えれば当然の内容です。
ぜんぜん別の型のオペランドを指定すれば、評価結果の型をコンパイル時に決定することができなくなってしまいますから。