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