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

时间:2014-07-10 17:50:00

标签: c enums c99 language-lawyer

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

请考虑以下代码:

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 标准是否明确了结果?

3 个答案:

答案 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)。