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

works well.

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

also works well.

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

works too. Is there any difference? When is one of them preferred over another?

4

3 回答 3

3

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

请注意,这与 C++ 不同,C++ 中的枚举值可以隐式转换为int,但反之则不行。

于 2013-08-11T14:20:52.340 回答
1

从理论上讲,您的第二个和第三个示例中存在一些问题。

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

因此,理论上有可能(当然,这几乎是不明智和可能的)一个实现选择了一个比 具有更高等级的整数类型int

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

于 2013-08-11T17:44:02.367 回答
0

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

第二个和第三个例子没有区别。回想一下, 的目的typedef是为数据类型分配不同的名称(并且还声明不透明的结构......不要对我说这件事)。

于 2013-08-11T14:09:03.907 回答