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。