キャスト演算子
提供: cppreference.com
明示的な型変換を行います。
目次 |
[編集] 構文
( type-name ) expression
|
|||||||||
ただし
type-name | - | void 型または任意のスカラー型のいずれか。 |
expression | - | スカラー型の任意の式 (ただし type-name が void の場合は、どのような式でも構いません)。 |
[編集] 説明
type-name が void の場合は、 expression はその副作用のために評価され、その戻り値は破棄されます (expression がそれのみで (式文として) 使用されたときと同じです)。
そうでなく、 type-name が expression の型と正確に一致する場合は、何も行われません (ただし expression が浮動小数点型であり、その型が示すよりも広い範囲および高い精度で表現されている場合は除きます (後述))。
そうでなければ、 expression の値は、以下のように、 type-name の表す型に変換されます。
代入の場合に行われる暗黙の変換はすべて許容されます。
暗黙の変換に加えて、以下の変換が許容されます。
- 任意の整数を任意のポインタ型にキャストできます。 NULL などのヌルポインタ定数 (その場合はキャストは必要ありません) を除いて、結果は処理系定義であり、正しくアラインされなかったり、その参照先の型のオブジェクトを指さなかったり、トラップ表現になったりします。
- 任意のポインタ型を任意の整数型にキャストできます。 結果は処理系定義です (たとえヌルポインタ値の場合でも。 値ゼロになるとは限りません)。 結果が変換先の型で表現できない場合、動作は未定義です (ポインタから符号なし整数へのキャストもモジュロ演算を保証しません)。
- 任意のオブジェクトへのポインタを任意の別のオブジェクトへのポインタにキャストできます。 値が変換先の型に対して正しくアラインされていない場合、動作は未定義です。 そうでなければ、その値を元の型に変換し戻した場合は、元の値と等しくなります。 オブジェクトへのポインタを任意の文字型へのポインタにキャストした場合、その結果はそのオブジェクトの最も低位なバイトを指し、変換先の型の sizeof までインクリメントできます (別の言い方をすると、オブジェクト表現を調べたり memcpy や memmove でコピーしたりするために使用できます)。
- 任意の関数へのポインタを任意の別の関数へのポインタにキャストできます。 変換後のポインタを関数呼び出しを行うために使用した場合、動作は未定義です (その関数型が互換な場合は除きます)。 変換後のポインタを元の型に変換し戻した場合は、元の値と等しくなります。
- ポインタ (オブジェクトでも関数でも) 間のキャストを行うとき、元の値がその型のヌルポインタ値であれば、結果は変換先の型の正しいヌルポインタ値です。
いずれの場合でも (暗黙の変換のときも、同じ型へのキャストのときも)、 expression と type-name が浮動小数点型であり、 expression がその型が示すよりも広い範囲および高い精度で表現されている (FLT_EVAL_METHOD を参照) 場合は、その範囲および精度は変換先の型と一致するように削ぎ落とされます。
キャスト式の値カテゴリは常に非左辺値です。
[編集] ノート
const、 volatile、 restrict、および atomic 修飾子は左辺値にのみ効果があるため、 cvr 修飾された型またはアトミック型へのキャストは対応する修飾されていない型へのキャストと正確に同等です。
void へのキャストは未使用の戻り値についてのコンパイラ警告を黙らせるために時々役に立ちます。
ここに掲載されていない変換は許容されません。 特に、
- ポインタと浮動小数点型の間の変換はありません。
- 関数へのポインタとオブジェクトへのポインタ (void* を含みます) の間の変換はありません。
- 関数へのポインタと整数の間の変換はありません。
[編集] 例
Run this code
#include <stdio.h> int main(void) { // オブジェクト表現の調査はキャストの合法的な使用方法です。 double d = 3.14; printf("The double %.2f(%a) is: ", d, d); for(size_t n = 0; n < sizeof d; ++n) printf("0x%02x ", ((unsigned char*)&d)[n]); // エッジケース struct S {int x;} s; // (struct S)s; // エラー、スカラー型ではありません // (たとえ同じ型へのキャストが何もしなくとも)。 (void)s; // OK、任意の型から void にキャストできます。 }
出力例:
The double 3.14(0x1.91eb851eb851fp+1) is: 0x1f 0x85 0xeb 0x51 0xb8 0x1e 0x09 0x40