如果我有枚举类型,例如:
枚举周{ sunday=0, monday, tuesday, wednesday, thursday, friday, saturday};
我有:
enum week day;
day = saturday;
day++;
一天的值(value)是多少?
最佳答案
枚举类型本质上是一个命名的整数值。该枚举类型与可以表示所有命名值的基础整数类型相关联。该基础整数类型需要能够表示所有唯一的命名值,但其实际类型是实现定义的。
在这种情况下,saturday
的数值将为 6
。递增它将给出 7
的数值。实际上,这不太可能溢出底层整数类型(int
、char
、unsigned char
或编译器选择的任何类型),因此打印使用 %d
格式的值将打印 7
。
但是,不存在值为 7
的 enum week
类型的枚举(命名)值。
如果递增枚举值会溢出基础整数类型(这里不是这种情况),则结果是未定义的。这是因为底层整数类型可能是有符号或无符号的,溢出有符号整数类型会导致未定义的行为。
理论上,编译器可能会为 enum week
使用底层类型,它只能表示值 0
到 6
-在这种情况下,递增 saturday
会产生未定义的行为。实际上,AFAIK,还没有任何 C 编译器不选择底层类型作为标准整数类型之一(char
、int
、 unsigned char
、unsigned
等)。所有这些类型都可以表示 7
的数值。
关于c - C 中枚举类型的溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30408698/