名前空間
変種
操作

キャスト演算子

From cppreference.com
< c‎ | language

明示的な型変換を実行します。

目次

[編集] 構文

( 型名 )

ここで、

型名 - void 型または任意の スカラー型
- 任意の 。ただし、型名void の場合は、任意の式が可能です。

[編集] 説明

もし 型名void であれば、 は副作用のために評価され、その返り値は破棄されます。これは、 が単独で 式文 として使用される場合と同様です。

そうでなく、もし 型名 の型と正確に一致する場合、何も行われません(ただし、 が浮動小数点型で、その型が示すよりも広い範囲と精度で表現されている場合を除く。下記参照)。

それ以外の場合、 の値は、以下のように 型名 で指定された型に変換されます。

代入によるすべての 暗黙の変換 が許可されます。

暗黙の変換に加えて、以下の変換が許可されます。

  • 任意の整数型は、任意のポインタ型にキャストできます。NULL のようなヌルポインタ定数(キャストが不要)を除き、結果は実装定義であり、正しくアラインメントされていない可能性、参照された型のオブジェクトを指していない可能性、または トラップ表現 である可能性があります。
  • 任意のポインタ型は、任意の整数型にキャストできます。結果はヌルポインタ値であっても実装定義です(ポインタから整数へのキャストで必ずしもゼロになるわけではありません)。結果がターゲット型で表現できない場合、動作は未定義です(ポインタからのキャストで符号なし整数はモジュロ演算を行いません)。
  • 任意のオブジェクトへのポインタは、他の任意のオブジェクトへのポインタにキャストできます。値がターゲット型に対して正しくアラインメントされていない場合、動作は未定義です。そうでなく、値が元の型にキャストし直された場合、元の値と比較して等しくなります。オブジェクトへのポインタが任意の文字型へのポインタにキャストされた場合、結果はそのオブジェクトの最下位バイトを指し、ターゲット型のサイズまでインクリメントできます(つまり、オブジェクト表現 を調べるため、または memcpy または memmove を介してコピーを作成するために使用できます)。
  • 任意の関数へのポインタは、他の任意の関数型へのポインタにキャストできます。結果のポインタが元の型にキャストし直された場合、元の値と比較して等しくなります。変換されたポインタを使用して関数呼び出しを行う場合、動作は未定義です(関数型が 互換性のある型 である場合を除く)。
  • ポインタ間(オブジェクトまたは関数)のキャストにおいて、元の値がその型のヌルポインタ値である場合、結果はターゲット型の適切なヌルポインタ値になります。

すべての場合において(暗黙の変換の実行時および同一型キャスト時)、型名 が浮動小数点型であり、 がその型が示すよりも広い範囲と精度で表現されている場合(FLT_EVAL_METHOD 参照)、範囲と精度はターゲット型に一致するように剥ぎ取られます。

キャスト式の 値カテゴリ は常に非lvalueです。

[編集] 注意

constvolatilerestrict、および _Atomic 修飾子は lvalue にのみ影響するため、cvr修飾型またはアトミック型へのキャストは、対応する非修飾型へのキャストと完全に同等です。

void へのキャストは、未使用の戻り値に関するコンパイラ警告を抑制するために役立つ場合があります。

ここでリストされていない変換は許可されません。特に、

  • ポインタ型と浮動小数点型の間の変換はありません。
  • 関数ポインタとオブジェクトポインタ(void* を含む)の間の変換はありません。

実装が intptr_t および/または uintptr_t を提供する場合、オブジェクト型(cv void を含む)へのポインタからこれらの型へのキャストは常に明確に定義されます。ただし、これは関数ポインタについては保証されません。

(C99以降)

関数ポインタとオブジェクトポインタ間の変換は、多くのコンパイラで拡張機能として受け入れられ、POSIX dlsym() 関数 の一部の用途で期待されています。

[編集]

#include <stdio.h>
 
int main(void)
{
    // examining object representation is a legitimate use of cast
    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]);
 
    // edge cases
    struct S { int x; } s;
//    (struct S)s; // error; not a scalar type
                   // even though casting to the same type does nothing
    (void)s; // okay to cast any type to void
}

実行結果の例

The double 3.14 (0x1.91eb851eb851fp+1) is: 0x1f 0x85 0xeb 0x51 0xb8 0x1e 0x09 0x40

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 6.5.4 キャスト演算子 (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 6.5.4 キャスト演算子 (p: 65-66)
  • C11標準 (ISO/IEC 9899:2011)
  • 6.5.4 キャスト演算子 (p: 91)
  • C99標準 (ISO/IEC 9899:1999)
  • 6.5.4 キャスト演算子 (p: 81)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 3.3.4 キャスト演算子

[編集] 関連項目

C++ ドキュメント明示的な型変換 について)
English 日本語 中文(简体) 中文(繁體)