Namespaces
Variants

cast operator

From cppreference.net

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

目次

構文

( 型名 )

ここで

type-name - void 型または任意の スカラ型
expression - 任意の スカラ型 (ただし type-name void の場合は任意の型が可能)

説明

type-name void の場合、 expression は副作用のために評価され、返される値は破棄されます。これは expression が単独で 式文 として使用される場合と同じです。

そうでなければ、 type-name expression の型と完全に一致する場合、何も行われない(ただし、 expression が浮動小数点型であり、その型が示す範囲と精度よりも広い範囲と精度で表現されている場合を除く – 下記参照)。

それ以外の場合、 expression の値は以下のように type-name で指定された型に変換されます:

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

暗黙的な変換に加えて、以下の変換が許可されています:

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

いずれの場合も(暗黙の変換の実行時および同じ型へのキャストの両方で)、 expression type-name が浮動小数点型であり、 expression がその型が示すよりも大きな範囲と精度で表現されている場合( FLT_EVAL_METHOD を参照)、範囲と精度は対象の型に合わせて除去されます。

キャスト式の value category は常に非左値です。

注記

const volatile restrict および _Atomic 修飾子は 左辺値 にのみ影響を与えるため、cvr修飾型またはatomic型へのキャストは、対応する非修飾型へのキャストと完全に等価です。

void へのキャストは、未使用の結果に関するコンパイラ警告を抑制するために時折有用です。

ここに記載されていない変換は許可されていません。特に、

  • ポインタと浮動小数点型の間の変換は存在しない。
  • 関数へのポインタとオブジェクトへのポインタ( void * を含む)の間の変換は存在しない。

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

(C99以降)

関数ポインタとオブジェクトポインタの間の変換は、多くのコンパイラで拡張機能として受け入れられており、POSIXの dlsym 関数の一部の使用法で期待されていることに注意してください。

#include <stdio.h>
int main(void)
{
    // オブジェクト表現の検査はキャストの正当な使用法である
    const double d = 3.14;
    printf("The double %.2f (%a) is: ", d, d);
    for (size_t n = 0; n != sizeof d; ++n)
        printf("%02X ", ((unsigned char*)&d)[n]);
    // エッジケース
    struct S { int x; } s;
    // (struct S)s; // エラー; スカラ型ではない(同じ型へのキャストが何も行わない場合でも)
                    //
    (void)s; // voidへのキャストは任意の型で可能
}

出力:

The double 3.14 (0x1.91eb851eb851fp+1) is: 1F 85 EB 51 B8 1E 09 40

参考文献

  • C23規格 (ISO/IEC 9899:2024):
  • 6.5.5 キャスト演算子 (p: 83-84)
  • 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++ documentation for explicit type conversion
日本語訳:
C++ documentation for 明示的な型変換
翻訳内容: - "C++ documentation" → そのまま(C++専門用語のため) - "explicit type conversion" → "明示的な型変換" - HTMLタグ、属性、構造は完全に保持 - リンク先やタイトル属性は変更なし