当声明枚举,如下图所示,做所有的C编译器设置的默认值x=0,y=1以及z=2在Linux和Windows系统?
typedef enum {
x,
y,
z
} someName;
Run Code Online (Sandbox Code Playgroud)
Jam*_*lis 108
是.除非在枚举的定义中另行指定,否则初始枚举器的值始终为零,并且每个后续枚举器的值都大于前一个枚举器的值.
Cir*_*四事件 68
C99标准
该N1265 C99草案说,在6.7.2.2/3"枚举符"
带=的枚举器将其枚举常量定义为常量表达式的值.如果第一个枚举器没有
=,则其枚举常量的值为0.每个后续的带有no的枚举器将其枚举常量定义为通过将1加上前一个枚举常量的值而获得的常量表达式的值.(使用带枚举的枚举数可能会产生枚举常量,其值与同一枚举中的其他值重复.)
所以以下内容始终适用于符合要求的实现:
#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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
如果enum变量的第一个值未初始化,则C编译器会自动将值分配为0.编译器会继续将先前的enum变量的值增加1。
例如:
enum months{jan,feb,mar}
Run Code Online (Sandbox Code Playgroud)
说明:jan的值将为0,feb的值为1,mar的值为2。
enum months{jan=123,feb=999,mar}
Run Code Online (Sandbox Code Playgroud)
说明:jan的值将为123,feb的值为999,mar的值为1000。
enum months{jan='a',feb='s',mar}
Run Code Online (Sandbox Code Playgroud)
说明:jan的值将为“ a”,feb的值为“ s”,mar的值为“ t”。