?
? ????? PHP ??? ???? ??? ?? ??
幾種表達(dá)式被稱為常量表達(dá)式。
#if 或 #elif 后面的表達(dá)式必須擴(kuò)展為。
除賦值,增量,減量,函數(shù)調(diào)用或逗號(hào)之外的其他操作符,其參數(shù)是預(yù)處理常量表達(dá)式
整數(shù)常量
字符常量
特殊的預(yù)處理器操作員 defined
當(dāng)在#if
表達(dá)式中計(jì)算字符常量時(shí),可以在源字符集,執(zhí)行字符集或其他一些實(shí)現(xiàn)定義的字符集中解釋字符常量。
Integer arithmetic in #if-expressions is performed using the semantics of intmax_t for signed types and uintmax_t for unsigned types. | (since C99) |
---|
一個(gè)整型常量表達(dá)式是表達(dá)式。
除賦值,遞增,遞減,函數(shù)調(diào)用或逗號(hào)以外的其他操作符,除了轉(zhuǎn)換操作符只能將算術(shù)類型轉(zhuǎn)換為整數(shù)類型
整數(shù)常量
枚舉常量
字符常量
浮點(diǎn)型常量,但前提是它們立即用作轉(zhuǎn)換為整數(shù)類型的操作數(shù)
操作數(shù)不是VLA的操作符的大?。ㄗ訡99起)
_Alignof operators | (since C11) |
---|
_Alignof operators
(since C11)
整數(shù)常量表達(dá)式在編譯時(shí)進(jìn)行評(píng)估。以下上下文需要稱為整型常量表達(dá)式的表達(dá)式':
位字段的大小。
枚舉常量的值
case
switch語(yǔ)句的標(biāo)簽
非VLA(自C99以來(lái))陣列的大小
整數(shù)指針隱式轉(zhuǎn)換。
The index in an array designator | (since C99) |
---|
數(shù)組指示符中的索引
(since C99)
The first argument of _Static_assert The integer argument of _Alignas | (since C11) |
---|
第一個(gè)論點(diǎn) _Static_assert
整數(shù)參數(shù) _Alignas
(since C11)
在具有 static 和 thread_local 存儲(chǔ)持續(xù)時(shí)間的對(duì)象的初始化器中使用的表達(dá)式必須是可能是以下某個(gè)表達(dá)式的表達(dá)式。
1)算術(shù)常數(shù)表達(dá)式,它是由任意算術(shù)類型組成的表達(dá)式
除賦值,增量,減量,函數(shù)調(diào)用或逗號(hào)以外的其他操作符,除了轉(zhuǎn)換操作符必須將算術(shù)類型轉(zhuǎn)換為其他算術(shù)類型
整數(shù)常量
浮點(diǎn)常量
枚舉常量
字符常量
操作數(shù)不是VLA的操作符的大小(自C99起)
_Alignof operators | (since C11) |
---|
_Alignof 操作符
(since C11)
2)空指針常量 NULL
3)地址常量表達(dá)式,這是
一個(gè)空指針
左值指定一個(gè)靜態(tài)存儲(chǔ)持續(xù)時(shí)間的對(duì)象或一個(gè)函數(shù)指示符,并轉(zhuǎn)換為指針
通過(guò)使用一元地址運(yùn)算符
通過(guò)將一個(gè)整型常量轉(zhuǎn)換為一個(gè)指針
通過(guò)數(shù)組到指針或函數(shù)到指針的隱式轉(zhuǎn)換
4)地址常量表達(dá)一些完整的對(duì)象類型,加或減一個(gè)整型常量表達(dá)式
與整型常量表達(dá)式不同,靜態(tài)初始化表達(dá)式不需要在編譯時(shí)進(jìn)行評(píng)估; 編譯器可以自由地將這些初始化程序轉(zhuǎn)換為在程序啟動(dòng)之前調(diào)用的可執(zhí)行代碼。
static int i = 2 || 1 / 0; // initializes i to value 1
浮點(diǎn)靜態(tài)初始化器的值永遠(yuǎn)不會(huì)比在運(yùn)行時(shí)執(zhí)行的相同表達(dá)式的值精確,但它可能會(huì)更好。
在靜態(tài)初始化器中未使用的浮點(diǎn)類型的算術(shù)常量表達(dá)式總是在運(yùn)行時(shí)期間評(píng)估為 - 如果受到當(dāng)前四舍五入的影響(如果 FENV_ACCESS處于打開(kāi)狀態(tài))并報(bào)告 math_errhandling 中指定的錯(cuò)誤。
void f(void){#pragma STDC FENV_ACCESS ON static float x = 0.0/0.0; // static initializer: does not raise an exception float w[] = { 0.0/0.0 }; // raises an exception float y = 0.0/0.0; // raises an exception double z = 0.0/0.0; // raises an exception}
如果一個(gè)表達(dá)式的計(jì)算結(jié)果不能用它的類型表示,那么它就不能用作常量表達(dá)式。
C11 standard (ISO/IEC 9899:2011):
6.6 Constant expressions (p: 106-107)
C99 standard (ISO/IEC 9899:1999):
6.6 Constant expressions (p: 95-96)
C89/C90 standard (ISO/IEC 9899:1990):
3.4 CONSTANT EXPRESSIONS