C中的枚举

时间:2013-08-11 14:03:02

标签: c enums

enum {YES=1,No=0};
int main()
{
    int i;
    i=YES;
    printf("%d",i);
}

效果很好。

enum B{YES=1,NO=0};
int main()
{
    enum B i;
    i=YES;
    printf("%d", i);
}

也很有效。

typedef enum {YES=1,NO=0} Boo;
int main()
{
    Boo i;
    i=YES;
    printf("%d", i);
}

也有效。 有什么区别吗?什么时候他们比另一个更喜欢?

3 个答案:

答案 0 :(得分:3)

在C中,具有enum类型和常规int的变量几乎没有差异。 C允许从enum值到int的隐式转换以及从intenum值的隐式转换,因此它们实际上是可互换的。我所知道的唯一实际区别是,使用枚举类型将更清楚地表达您的意图,即值应该只是枚举的命名值之一。

请注意,这与C ++形成对比,其中枚举值可以隐式转换为int,但不是相反。

答案 1 :(得分:1)

理论上,你的第二和第三个例子中有一点点。

与C ++不同,标准C仅表示每个枚举类型应与整数类型兼容。类型的选择是实现定义的。

因此,理论上可能(当然,几乎没有理智和可能)实现选择一个排名高于int的整数类型。

在这种情况下,%d格式说明符可能与i的提升类型不对应,这意味着未定义的行为。

答案 2 :(得分:0)

您的第一个和第二个(和第三个)示例之间的区别在于您将i定义为两个单独的数据类型。一个是int,另一个是enum B

第二个和第三个例子之间没有区别。回想一下typedef的目的是为数据类型指定不同的名称(并且还声明不透明的结构......不要对此有所了解。)