【发布时间】:2011-09-20 00:25:43
【问题描述】:
如下所示声明枚举时,是否所有 C 编译器在 Linux 和 Windows 系统上都将默认值设置为 x=0、y=1 和 z=2?
typedef enum {
x,
y,
z
} someName;
【问题讨论】:
-
是的,这是标准要求的,我相信有人会引用它们。
如下所示声明枚举时,是否所有 C 编译器在 Linux 和 Windows 系统上都将默认值设置为 x=0、y=1 和 z=2?
typedef enum {
x,
y,
z
} someName;
【问题讨论】:
是的。除非您在枚举的定义中另外指定,否则初始枚举数的值始终为零,并且每个后续枚举数的值都比前一个枚举数大一。
【讨论】:
[dcl.enum]:“如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值加一而获得的值。 "
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 中测试。
【讨论】:
是的,枚举值默认从 0 到第 n 个元素到任何平台。
【讨论】:
如果枚举变量的第一个值没有被初始化,那么 C 编译器会自动赋值 0。编译器会继续将前面的枚举变量的值增加 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' 不能保证,可能存在字母不按字母顺序排列的字符集