C 允许int时,枚举数可能出现的语句是否多余?

C 允许int时,枚举数可能出现的语句是否多余?,c,enums,language-lawyer,C,Enums,Language Lawyer,我正在阅读有关枚举数的标准N2310,遇到了一些误解 6.7.2.2/3: 枚举器列表中的标识符声明为 具有类型int,可在允许的任何地方出现 也 6.7.2.2/4: 每个枚举类型应与有符号整数char兼容 类型,或无符号整数类型 但是有符号整数类型和无符号整数类型的定义允许整数类型比int更宽。实际上: 6.2.5/4: 有五种标准的有符号整数类型,指定为 signed char、short int、int、long int和long long int。(这些和其他 类型可以通过几种其他方式

我正在阅读有关枚举数的标准
N2310
,遇到了一些误解

6.7.2.2/3:

枚举器列表中的标识符声明为 具有类型
int
,可在允许的任何地方出现

6.7.2.2/4:

每个枚举类型应与有符号整数
char
兼容 类型,或无符号整数类型

但是有符号整数类型无符号整数类型的定义允许整数类型比
int
更宽。实际上:

6.2.5/4:

有五种标准的有符号整数类型,指定为
signed char
short int
int
long int
long long int
。(这些和其他 类型可以通过几种其他方式指定,如中所述 6.7.2.)也可能存在实现定义的扩展有符号整数类型。38)标准和扩展有符号整数类型为 统称为有符号整数类型。(39)


因此,编译器选择
long long int
char
作为枚举类型的表示形式是合法的,即使枚举数始终具有类型
int
。此外,整数升级总是转换为
int
。因此,如果实现为枚举类型表示选择
long-long-int
char
,我们将分配不兼容的类型。大概是这样的:

//char is wide enough to hold all the values, let's choose it
enum something{
   a = 0,
   b  
};

enum something sth = a; //a has type int, but enum something is incompatible with int
                        //UB?
我们应该做一个明确的演员阵容来保持严格的一致性吗

enum something sth = (enum something) a;

不兼容类型的赋值
无论如何
a
将隐式转换为
something
枚举的兼容整数类型。这就像
char sth2=a。字符常量的类型为
int
,但您永远不会使用
char c=(char)“x”@KamilCuk实际上没有注意到这一点
6.5.16/2
明确指出:在简单赋值(=)中,右操作数的值转换为赋值表达式的类型,并替换左操作数指定的对象中存储的值。因此,即使枚举数和枚举数的类型可能不兼容,也会转换为正确的类型nnyway。