B.5.2 常量表达式
常量表达式是每一项都是常量值的表达式。在下列情况中,常量表达式是必需的:
(1)作为switch语句中case之后的值
(2)指定数组的大小
(3)为枚举标识符指派值
(4)在结构定义中,指定位域的大小
(5)为外部或静态变量指派初始值
(6)为全局变量指派初始值
(7)在#if预处理程序语句中,作为#if之后的表达式
在前4种情况中,常量表达式必须由整数常量、字符常量、枚举常量和sizeof表达式组成。在此只能使用以下运算符:算术运算符、按位运算符、关系运算符、条件表达式运算符和类型强制转换运算符。
在第5和第6种情况中,除了上面提到的规则之外,还可以显式地或隐式地使用取地址运算符。然而,它只能应用于外部或静态变量或函数。因此,假设x是一个外部或静态变量,表达式
&x+10
将是合法的常量表达式。此外,表达式
&a[10]-5
在a是外部或静态数组时将是合法的常量表达式。最后,因为&a[0]等价于表达式a,所以
a+sizeof(char)*100
也是一个合法的常量表达式。
对于最后一种需要常量表达式(在#if之后)的情况,除了不能使用sizeof运算符、枚举常量和类型强制转换运算符以外,其余规则与前4种情况的规则相同。然而,它允许使用特殊的defined运算符(参见“if指令”一节)。