?
This document uses PHP Chinese website manual Release
執(zhí)行明確的類型轉(zhuǎn)換。
( type-name ) expression |
---|
其中
類型名 | - | 無論是 void 類型還是任何標量類型 |
---|---|---|
表達 | - | 標量類型的任何表達式(除非類型名稱是無效的,在這種情況下,它可以是任何東西) |
如果 type-name 是void
,那么表達式會計算其副作用,并將其返回值作為表達式語句放棄,與將表達式單獨使用時相同。
否則,如果 type-name 恰好是表達式的類型,則不做任何事情(除非表達式具有浮動類型,并且表示的范圍和精度比其類型指示的大 - 參見下文)。
否則,表達式的值將轉(zhuǎn)換為由 type-name 命名的類型,如下所示:
每個隱式轉(zhuǎn)換就像是通過賦值一樣是允許的。
除了隱式轉(zhuǎn)換之外,還允許進行以下轉(zhuǎn)換:
任何整數(shù)都可以轉(zhuǎn)換為任何指針類型。除了空指針常量NULL
(不需要強制轉(zhuǎn)換)之外,結果是實現(xiàn)定義的,可能未正確對齊,可能不指向引用類型的對象,并且可能是陷阱表示。
任何指針類型都可以轉(zhuǎn)換為任何整數(shù)類型。結果是實現(xiàn)定義的,即使對于空指針值(它們不一定會導致值為零)。如果結果不能在目標類型中表示,則行為是未定義的(無符號整數(shù)不能對來自指針的強制執(zhí)行模運算)
任何指向?qū)ο蟮闹羔樁伎梢赞D(zhuǎn)換為任何其他指向?qū)ο蟮闹羔?。如果該值未針對目標類型正確對齊,則行為未定義。否則,如果該值被轉(zhuǎn)換回原始類型,則它與原始值相等。如果指向?qū)ο蟮闹羔樲D(zhuǎn)換為指向任何字符類型的指針,則結果指向該對象的最低字節(jié),并且可以遞增至目標類型的大小(換言之,可用于檢查對象表示或制作memcpy
或通過復制memmove
)。
任何指向函數(shù)的指針都可以轉(zhuǎn)換為指向任何其他函數(shù)類型的指針。如果生成的指針轉(zhuǎn)換回原始類型,則它與原始值相等。如果轉(zhuǎn)換的指針用于進行函數(shù)調(diào)用,則行為是未定義的(除非函數(shù)類型兼容)
在指針(對象或函數(shù))之間進行轉(zhuǎn)換時,如果原始值是其類型的空指針值,則結果是目標類型的正確空指針值。
無論如何(在執(zhí)行隱式轉(zhuǎn)換時以及在同一類型轉(zhuǎn)換中),如果 expression 和 type-name 是浮點類型,并且表達式的范圍和精度比其類型所指示FLT_EVAL_METHOD
的范圍和精度要高(參見范圍和精度被刪除)關閉以匹配目標類型。
轉(zhuǎn)換表達式的值類別始終是非左值。
因為const,volatile,restrict 和 atomic 限定符只對左值有影響,所以對 cvr 限定或原子類型的轉(zhuǎn)換完全等同于轉(zhuǎn)換為相應的非限定類型。
無效的轉(zhuǎn)換有時可以用來消除關于未使用結果的編譯器警告。
未列在這里的轉(zhuǎn)換不被允許。尤其是,
指針和浮點類型之間沒有轉(zhuǎn)換
在指向函數(shù)的指針和指向?qū)ο蟮闹羔樦g沒有轉(zhuǎn)換(包括void*
)
在指向函數(shù)和整數(shù)的指針之間沒有轉(zhuǎn)換
#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
C11 standard (ISO/IEC 9899:2011):
6.5.4 Cast operators (p: 91)
C99 standard (ISO/IEC 9899:1999):
6.5.4 Cast operators (p: 81)
C89/C90 standard (ISO/IEC 9899:1990):
3.3.4 Cast operators