[C言語入門] 演算子の使い方(7)
高木です。おはようございます。
なかなか演算子の使い方の解説が終わりませんね。
改めて書いてみると、Cの演算子も結構豊富だなあと感じます。
そんなわけで、さっそく本題に入ることにしましょう。
今回はキャスト演算子です。
キャスト演算子
キャスト演算子も前置形式の単項演算子で、明示的な型変換を行うために使用します。
Cのキャスト演算子は型名を括弧で囲んだ形になります。
1 2 | int a = 123; long b = (long)a << 20; |
上の例では、int型のオブジェクトa
をキャスト演算子を使ってlong型に明示的に型変換しています。
キャスト演算子のオペランドは修飾版または非修飾版のスカラ型でなければなりません。
以前にも解説しましたが、スカラ型というのは算術型とポインタ型の総称です。
算術型は整数型と浮動小数点型の総称になります。
浮動小数点型は複素数型も含むことに注意してください。
修飾版または非修飾版というのは、const修飾子などで修飾されていても、修飾されていなくてもかまわないということです。
キャスト演算子で指定する型は、通常は修飾版または非修飾版のスカラ型です。
それ以外にもvoid型を指定することもできます。
次のいずれの条件にも当てはまらない型変換は、明示的なキャストが必要になります。
- 算術型から算術型への型変換
- 適合する型のポインタ同士の型変換で、変換先の型修飾が変換元の型修飾のすべてを含む
- オブジェクト型または不完全型へのポインタとvoidへのポインタの間の型変換で、変換先の型修飾が変換元の型修飾のすべてを含む
- 空ポインタ定数からポインタ型への型変換
- ポインタ型から_Bool型への型変換
実際のCコンパイラは、明示的なキャストが必要な状況であっても暗黙的に型変換してしまうことがほとんどです。
警告ぐらいは出しますが、なかなかコンパイル・エラーにはしてくれません。
なお、明示的にキャストを行えば、上記以外の条件でも型変換が可能になります。
たとえば、修飾版の型へのポインタから非修飾版の型へのポインタへの変換や、ポインタ型と整数型の相互変換などです。
ただし、浮動小数点型とポインタ型の間では型変換を行うことができません(整数型を介せば可能です)。
今回はキャスト演算子の解説ですので、型変換の詳細については別の機会に解説できればと考えています。
整数拡張、通常の算術型変換、既定の実引数拡張など、型変換に関しては細かな仕様が多いので結構な分量になると思います。
興味のある方は上記のキーワードで検索してみてください。