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