在C中溢出枚举类型?

jnd*_*jnd 7 c enums integer-overflow

如果我有枚举类型,例如:

enum week{ sunday=0, monday, tuesday, wednesday, thursday, friday, saturday};

我有:

enum week day;
day = saturday;
day++;
Run Code Online (Sandbox Code Playgroud)

一天的价值是多少?

Pet*_*ter 4

枚举类型本质上是一个命名的整数值。该枚举类型与可以表示所有命名值的基础整型相关联。该底层整型类型需要能够表示所有唯一的命名值,但其实际类型是实现定义的。

在这种情况下, 的数值saturday将为6。增加它将会得到 的数值7。实际上,这不太可能溢出底层整数类型(intcharunsigned char或编译器选择的任何类型),因此使用格式打印值%d将打印7

但是,不存在值为 的类型的枚举(命名)enum week7

如果递增枚举值会溢出基础整数类型(此处不是这种情况),则结果是未定义的。这是因为基础整数类型可能是有符号的或无符号的,并且溢出有符号整数类型会产生未定义的行为。

理论上,编译器可能会使用enum week只能表示值的0底层类型6- 在这种情况下递增saturday会产生未定义的行为。实际上,据我所知,还没有任何 C 编译器不选择基础类型作为标准整型类型之一(charintunsigned charunsigned等)。所有这些类型都可以表示 的数值7