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);
}
也有效。 有什么区别吗?什么时候他们比另一个更喜欢?
答案 0 :(得分:3)
在C中,具有enum
类型和常规int
的变量几乎没有差异。 C允许从enum
值到int
的隐式转换以及从int
到enum
值的隐式转换,因此它们实际上是可互换的。我所知道的唯一实际区别是,使用枚举类型将更清楚地表达您的意图,即值应该只是枚举的命名值之一。
请注意,这与C ++形成对比,其中枚举值可以隐式转换为int
,但不是相反。
答案 1 :(得分:1)
理论上,你的第二和第三个例子中有一点点。
与C ++不同,标准C仅表示每个枚举类型应与整数类型兼容。类型的选择是实现定义的。
因此,理论上可能(当然,几乎没有理智和可能)实现选择一个排名高于int
的整数类型。
在这种情况下,%d
格式说明符可能与i
的提升类型不对应,这意味着未定义的行为。
答案 2 :(得分:0)
您的第一个和第二个(和第三个)示例之间的区别在于您将i
定义为两个单独的数据类型。一个是int
,另一个是enum B
。
第二个和第三个例子之间没有区别。回想一下typedef
的目的是为数据类型指定不同的名称(并且还声明不透明的结构......不要对此有所了解。)