当像下面展示的那样声明一个枚举时,所有C编译器在Linux和Windows系统上默认会将值设置为 x=0
、y=1
和 z=2
吗?
typedef enum {
x,
y,
z
} someName;
是的。除非在枚举的定义中另有说明,否则初始枚举值总是为零,并且每个后续枚举器的值都比前一个枚举器大一。
[dcl.enum]
实现的:“如果第一个枚举值没有初始化程序,则相应常量的值为零。没有初始化器的枚举器定义通过将上一个枚举器的值增加一来给枚举器赋值。” - Ben VoigtC99标准
N1265 C99 draft 在6.7.2.2/3 "枚举说明符"中指出:
带有=的枚举器将其枚举常量定义为常量表达式的值。如果第一个枚举器没有
=
,则其枚举常量的值为0。每个后续没有=的枚举器将其枚举常量定义为前一个枚举常量的值加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 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”。
是的,枚举值默认从0开始到第n个元素适用于任何平台。