?
This document uses PHP Chinese website manual Release
幾種表達(dá)式被稱為常量表達(dá)式。
#if 或 #elif 后面的表達(dá)式必須擴(kuò)展為。
除賦值,增量,減量,函數(shù)調(diào)用或逗號之外的其他操作符,其參數(shù)是預(yù)處理常量表達(dá)式
整數(shù)常量
字符常量
特殊的預(yù)處理器操作員 defined
當(dāng)在#if
表達(dá)式中計算字符常量時,可以在源字符集,執(zhí)行字符集或其他一些實現(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) |
---|
一個整型常量表達(dá)式是表達(dá)式。
除賦值,遞增,遞減,函數(shù)調(diào)用或逗號以外的其他操作符,除了轉(zhuǎn)換操作符只能將算術(shù)類型轉(zhuǎn)換為整數(shù)類型
整數(shù)常量
枚舉常量
字符常量
浮點型常量,但前提是它們立即用作轉(zhuǎn)換為整數(shù)類型的操作數(shù)
操作數(shù)不是VLA的操作符的大?。ㄗ訡99起)
_Alignof operators | (since C11) |
---|
_Alignof operators
(since C11)
整數(shù)常量表達(dá)式在編譯時進(jìn)行評估。以下上下文需要稱為整型常量表達(dá)式的表達(dá)式':
位字段的大小。
枚舉常量的值
case
switch語句的標(biāo)簽
非VLA(自C99以來)陣列的大小
整數(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) |
---|
第一個論點 _Static_assert
整數(shù)參數(shù) _Alignas
(since C11)
在具有 static 和 thread_local 存儲持續(xù)時間的對象的初始化器中使用的表達(dá)式必須是可能是以下某個表達(dá)式的表達(dá)式。
1)算術(shù)常數(shù)表達(dá)式,它是由任意算術(shù)類型組成的表達(dá)式
除賦值,增量,減量,函數(shù)調(diào)用或逗號以外的其他操作符,除了轉(zhuǎn)換操作符必須將算術(shù)類型轉(zhuǎn)換為其他算術(shù)類型
整數(shù)常量
浮點常量
枚舉常量
字符常量
操作數(shù)不是VLA的操作符的大小(自C99起)
_Alignof operators | (since C11) |
---|
_Alignof 操作符
(since C11)
2)空指針常量 NULL
3)地址常量表達(dá)式,這是
一個空指針
左值指定一個靜態(tài)存儲持續(xù)時間的對象或一個函數(shù)指示符,并轉(zhuǎn)換為指針
通過使用一元地址運算符
通過將一個整型常量轉(zhuǎn)換為一個指針
通過數(shù)組到指針或函數(shù)到指針的隱式轉(zhuǎn)換
4)地址常量表達(dá)一些完整的對象類型,加或減一個整型常量表達(dá)式
與整型常量表達(dá)式不同,靜態(tài)初始化表達(dá)式不需要在編譯時進(jìn)行評估; 編譯器可以自由地將這些初始化程序轉(zhuǎn)換為在程序啟動之前調(diào)用的可執(zhí)行代碼。
static int i = 2 || 1 / 0; // initializes i to value 1
浮點靜態(tài)初始化器的值永遠(yuǎn)不會比在運行時執(zhí)行的相同表達(dá)式的值精確,但它可能會更好。
在靜態(tài)初始化器中未使用的浮點類型的算術(shù)常量表達(dá)式總是在運行時期間評估為 - 如果受到當(dāng)前四舍五入的影響(如果 FENV_ACCESS處于打開狀態(tài))并報告 math_errhandling 中指定的錯誤。
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}
如果一個表達(dá)式的計算結(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