如果枚举对象设置为不等于其各自枚举常量的值,那么它具有什么值?
请考虑以下代码:
enum foobar{
FOO = 1,
BAR = 5
};
enum foobar baz = 5;
enum foobar qux = 42;
变量baz
设置为整数值5
,而变量qux
设置为整数值42
。
我怀疑变量baz
将保留值BAR
,但我不确定变量qux
。没有为枚举常量赋值42
,那么当enum foobar
变量设置为这样的值时会发生什么?
C99 标准是否明确了结果?
答案 0 :(得分:6)
变量qux
不会包含任何enum
个值。它的值将等于编译器选择表示foobar
的基础类型中的42,这是实现定义的。当值为42
时,这不会出现问题,但是当常量不适合编译器为枚举选择的类型时,它可能会成为一个问题。
编译器允许赋值enum
常量以外的值的原因之一是支持" flag"枚举,当预期常量按位运算组合时:
enum foobar {
foo = 1
, bar = 2
, baz = 4
} test = (foo | baz);
上面的变量test
保存5
的值,该值与任何enum
常量都不对应。
答案 1 :(得分:2)
C99 draft standard似乎并不限制枚举器专门接受其成员的值,但它确实说基础类型的枚举器应该能够表示其所有成员的值。这将在6.7.2.2
枚举说明符:
每个枚举类型应与char(一个有符号整数)兼容 类型或无符号整数类型。类型的选择是 实现定义的, 110)但应能够代表 枚举的所有成员的值。
因此,如果您使用的值大于成员定义的值,那么您将依赖于实现定义的行为。在有符号整数的情况下,溢出会导致未定义的行为,如5
部分所述:
如果在评估过程中出现异常情况 表达式(即,如果结果未在数学上定义或 不在其类型的可表示值的范围内),行为 未定义。
通常情况下,我们会看到枚举的值超出其成员指定的值时用于表示位字段。
答案 2 :(得分:1)
enum foobar{
FOO = 1,
BAR = 5
};
enum foobar baz = 5;
baz
声明等同于:
enum foobar baz = BAR;
由于BAR
是值int
的{{1}}。
此声明也有效:
5
C表示enum foobar qux = 42;
类型是一个足以表示其所有枚举常量的整数类型。如果enum
类型不够大,则根据整数转换规则(c99,6.3.1.3)将值转换为每个整数类型的枚举整数类型。此整数转换可以是实现定义的(参见6.3.1.3p3)。