如下所示声明枚举时,所有C编译器都会在Linux和Windows系统上将默认值设置为x=0
,y=1
和z=2
吗?
typedef enum {
x,
y,
z
} someName;
答案 0 :(得分:103)
是。除非您在枚举的定义中另行指定,否则初始枚举器的值始终为零,并且每个后续枚举器的值都大于前一个枚举器的值。
答案 1 :(得分:62)
C99标准
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中测试。
答案 2 :(得分:3)
如果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'。
答案 3 :(得分:-15)
是的,枚举值bydefult从0开始到第n个元素到任何平台。