轉型運算子
出自 cppreference.com
執行顯式型別轉換
目錄 |
[編輯] 語法
( 型別名稱 ) 運算式 |
|||||||||
其中
| 類型名稱 | - | void 型別或任何純量型別 (scalar type) |
| expression | - | 任何純量型別 (scalar type) 的運算式(除非 型別名稱 為 void,在這種情況下可以是任何東西) |
[編輯] 解釋
如果 型別名稱 為 void,則計算 運算式 以產生其副作用,並丟棄其回傳值;這與單獨將 運算式 作為運算式語句使用時相同。
否則,如果 型別名稱 正好是 運算式 的型別,則不執行任何動作(除了若 運算式 為浮點型別,且其實際表示範圍與精度大於該型別所定義者——參見下文)
否則,運算式 的值將轉換為 型別名稱 所指定的型別,方式如下:
允許所有隱式轉換(如同賦值運算)。
除了隱式轉換外,還允許下列轉換:
- 任何整數皆可轉型為任何指標型別。除了空指標常數(如 NULL,此類常數不需要轉型)之外,結果由實作定義,可能未正確對齊,可能未指向參考型別的物件,且可能為陷阱表示 (trap representation)。
- 任何指標型別皆可轉型為任何整數型別。結果由實作定義,即使對於空指標值也是如此(它們不一定會產生數值零)。如果結果無法在目標型別中表示,則行為未定義(無號整數在指標轉型時並不實作模運算)。
- 任何物件指標皆可轉型為任何其他物件指標。如果該值對於目標型別未正確對齊,則行為未定義。否則,若將該值轉換回原始型別,其比較結果將等於原始值。如果物件指標被轉型為任何字元型別的指標,結果將指向該物件的最低位元組,並且可以遞增至目標型別的 sizeof 大小(換句話說,可以用來檢查物件表示,或透過 memcpy 或 memmove 進行複製)。
- 任何函式指標皆可轉型為任何其他函式指標型別。如果產生的指標被轉換回原始型別,其比較結果將等於原始值。如果轉換後的指標被用於進行函式呼叫,則行為未定義(除非函式型別為相容的 (compatible))。
- 當在指標(物件指標或函式指標)之間進行轉型時,若原始值是該型別的空指標值,則結果為目標型別對應的正確空指標值。
在任何情況下(無論是執行隱式轉換還是在相同型別轉型中),若 運算式 和 型別名稱 皆為浮點型別,且 運算式 的表示範圍與精度大於其型別所定義者(參見 FLT_EVAL_METHOD),則多出的範圍與精度將被移除以符合目標型別。
轉型運算式的值類別 (value category) 永遠是非左值 (non-lvalue)。
[編輯] 附註
由於 const、volatile、restrict 以及 _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++ 文件 關於 顯式型別轉換
|