命名空間
變體
動作

轉型運算子

出自 cppreference.com
< c‎ | 語言

執行顯式型別轉換

目錄

[編輯] 語法

( 型別名稱 ) 運算式

其中

類型名稱 - void 型別或任何純量型別 (scalar type)
expression - 任何純量型別 (scalar type)運算式(除非 型別名稱 為 void,在這種情況下可以是任何東西)

[編輯] 解釋

如果 型別名稱void,則計算 運算式 以產生其副作用,並丟棄其回傳值;這與單獨將 運算式 作為運算式語句使用時相同。

否則,如果 型別名稱 正好是 運算式 的型別,則不執行任何動作(除了若 運算式 為浮點型別,且其實際表示範圍與精度大於該型別所定義者——參見下文)

否則,運算式 的值將轉換為 型別名稱 所指定的型別,方式如下:

允許所有隱式轉換(如同賦值運算)

除了隱式轉換外,還允許下列轉換:

  • 任何整數皆可轉型為任何指標型別。除了空指標常數(如 NULL,此類常數不需要轉型)之外,結果由實作定義,可能未正確對齊,可能未指向參考型別的物件,且可能為陷阱表示 (trap representation)
  • 任何指標型別皆可轉型為任何整數型別。結果由實作定義,即使對於空指標值也是如此(它們不一定會產生數值零)。如果結果無法在目標型別中表示,則行為未定義(無號整數在指標轉型時並不實作模運算)。
  • 任何物件指標皆可轉型為任何其他物件指標。如果該值對於目標型別未正確對齊,則行為未定義。否則,若將該值轉換回原始型別,其比較結果將等於原始值。如果物件指標被轉型為任何字元型別的指標,結果將指向該物件的最低位元組,並且可以遞增至目標型別的 sizeof 大小(換句話說,可以用來檢查物件表示,或透過 memcpymemmove 進行複製)。
  • 任何函式指標皆可轉型為任何其他函式指標型別。如果產生的指標被轉換回原始型別,其比較結果將等於原始值。如果轉換後的指標被用於進行函式呼叫,則行為未定義(除非函式型別為相容的 (compatible))。
  • 當在指標(物件指標或函式指標)之間進行轉型時,若原始值是該型別的空指標值,則結果為目標型別對應的正確空指標值。

在任何情況下(無論是執行隱式轉換還是在相同型別轉型中),若 運算式型別名稱 皆為浮點型別,且 運算式 的表示範圍與精度大於其型別所定義者(參見 FLT_EVAL_METHOD),則多出的範圍與精度將被移除以符合目標型別。

轉型運算式的值類別 (value category) 永遠是非左值 (non-lvalue)。

[編輯] 附註

由於 constvolatilerestrict 以及 _Atomic 限定詞僅對左值有效,因此轉型為 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: 待定)
  • 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 Deutsch 日本語 中文(简体) 中文(繁體)