对于所有编译器,C中的默认枚举值是否相同?

SSS*_*SSS 104 c enums

当声明枚举,如下图所示,做所有的C编译器设置的默认值x=0,y=1以及z=2在Linux和Windows系统?

typedef enum {
    x,
    y,
    z
} someName;
Run Code Online (Sandbox Code Playgroud)

Jam*_*lis 108

是.除非在枚举的定义中另行指定,否则初始枚举器的值始终为零,并且每个后续枚举器的值都大于前一个枚举器的值.

  • 并且,C和C++都需要这种相同的行为.在C++中,它是`[dcl.enum]`:"如果第一个枚举器没有初始化器,则相应常量的值为零.没有初始化器的枚举器定义为枚举器提供通过增加前一个值获得的值.一位普查员." (13认同)
  • 是的,还有其他以字母C开头的语言,如C#. (3认同)

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”。

  • mar 不能保证为“t”,可能存在字母不按连续字母顺序排列的字符集 (2认同)