Answers:
是。除非在枚举的定义中另外指定,否则初始枚举器的值始终为零,并且每个后续枚举器的值都比前一个枚举器大1。
[dcl.enum]
:“如果第一个枚举器没有初始化程序,则相应常数的值为零。不带初始化程序的枚举器定义将通过将前一个枚举器的值加1而获得的值赋予枚举器。”
C99标准
该N1265 C99草案说,在6.7.2.2/3“枚举符”
带有=的枚举数将其枚举常量定义为常量表达式的值。如果第一个枚举数为no
=
,则其枚举常数的值为0。每个后续的no =的枚举数都将其枚举常数定义为将前一个枚举常数的值加1所得的常数表达式的值。(将枚举数与=一起使用可能会产生枚举常量,其值与同一枚举中的其他值重复。)
因此,以下始终适用于符合标准的实现:
main.c
#include <assert.h>
#include <limits.h>
enum E {
E0,
E1,
E2 = 3,
E3 = 3,
E4,
E5 = INT_MAX,
#if 0
/* error: overflow in enumeration values */
E6,
#endif
};
int main(void) {
/* If unspecified, the first is 0. */
assert(E0 == 0);
assert(E1 == 1);
/* Repeated number, no problem. */
assert(E2 == 3);
assert(E3 == 3);
/* Continue from the last one. */
assert(E4 == 4);
assert(E5 == INT_MAX);
return 0;
}
编译并运行:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c
./main.out
已在Ubuntu 16.04,GCC 6.4.0中测试。
如果enum变量的第一个值未初始化,则C编译器会自动将值分配为0.编译器会继续将先前的enum变量的值增加1。
例如:
enum months{jan,feb,mar}
说明:jan的值将为0,feb的值为1,mar的值为2。
enum months{jan=123,feb=999,mar}
说明:jan的值将为123,feb的值为999,mar的值为1000。
enum months{jan='a',feb='s',mar}
说明:jan的值为'a',feb的值为's',mar的值为't'。
't'
不能保证,就不可能有字符集,其中的字母不连续字母顺序排列
是的,枚举值默认从0到第n个元素开始到任何平台。