枚举对象设置为不等于其各自枚举常量的值

如果将枚举对象设置为不等于其各自枚举常量的值,则枚举对象具有什么值?

请考虑以下代码:

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是值为5int

该声明也有效:

 enum foobar qux = 42; 

C表示enum类型是一个足够大的整数类型,表示它的所有枚举常量。 如果enum类型不够大,则根据整数转换规则(c99,6.3.1.3)将值转换为每个整数类型的枚举整数类型。 此整数转换可以是实现定义的 (参见6.3.1.3p3)。