给定:
enum week {
sunday=0, monday, tuesday, wednesday, thursday, friday, saturday
};
enum week day = saturday;
day ++;
day
的值为7
。
引用2011年ISO C标准6.7.2.2第1段:
每个枚举类型都应与char
、有符号整数类型或无符号整数类型兼容。类型的选择是实现定义的,但应能表示枚举所有成员的值。
_Bool
是一种无符号整数类型,但它不满足这个特定枚举类型的要求。
由于CHAR_BIT
的值至少为8
,并且要求类型char
、unsigned char
和signed char
没有填充位,因此每种字符类型的范围必须至少涵盖0
到127
。更宽的整数类型(short
,int
等)的范围至少与signed char
或unsigned char
相同。因此,与enum week
兼容的实现定义类型的下限不得大于0
,上限不得小于127
。
(
警告:下面进入语言解释阶段)可能存在一种漏洞,允许使用比
_Bool
更宽但比
char
更窄的
扩展整数类型。例如,我认为大小为8位但只有3个值位的扩展整数类型是合法的。但由于整数类型必须使用二进制表示,具有3个值位的无符号类型将能够表示从0到7的值,而具有2个值位的无符号类型将无法表示
saturday
的值。由于
enum week
可以保存值
6
,因此它也必须能够保存值
7
。在一个不寻常的实现中,它可能无法表示值
8
,但你不太可能遇到这样的实现。
基本上,鉴于整数类型必须使用纯二进制表示,任何能够表示6
的类型也能够表示7
,尽管它并不自动表示也能表示8
。
printf("%d\n", ++(day = saturday));
。当然,如果你必须问,那么你可能不应该将它放入程序中,因为每次阅读它时都保证看起来像一个错误。 - Parthian Shot