在C语言中为枚举类型赋值

10

在c.color = 1这样的操作中,将int类型分配给枚举类型是否合法? 我运行了这段代码,似乎它确实将c.color设置为BLUE,因为BYE被打印出来了,但我想知道这是否真正正确地设置了枚举。

typedef enum {
   GREEN = 0,
   BLUE
}COLOR;

typedef struct{
    COLOR color;
}COLORS;

int main()
{
    COLORS c;
    c.color = 1;
    if(c.color == BLUE)
    {
       printf("BYE");
    }
}

简短的回答是“是”。enum除了是一个整数类型外,还创建了全局常量,可以使用方便的常量来设置枚举中的任何一个值,而不是使用魔术数字,例如enum direction { NORTH, WEST, SOUTH, EAST }; direction = SOUTH; switch direction { case NORTH: /* do suff */ break; case WEST: /* do stuff */ break; ...您可以使用enum声明全局常量,而不管您是否在代码中稍后使用enum,例如enum { MAXC = 128, MAXN = 512 }; - David C. Rankin
相关主题:如何创建类型安全的枚举? - Lundin
4个回答

8
enum 被视为整数类型。因此,您可以将整数分配给具有 enum 类型的变量。 来自 C 标准的第 6.2.5 节:
“16 枚举包括一组命名的整数常量值。每个独立的枚举构成了不同的枚举类型。”
“17 char 类型、有符号和无符号整数类型,以及枚举类型被统称为整数类型。整数和实浮点类型统称为实数类型。”

3
您可以这样设置枚举,但最好使用“BLUE”而不是“1”。使用特定数字被称为“魔术数字”,会使代码更难理解和维护。当您直接使用枚举名称进行分配时,稍后回到代码的人(包括几周或几个月后的自己)希望能够立即理解代码正在做什么,而无需查找“1”的含义。这段代码可能看起来很简单易懂,但一旦您的代码有许多文件和层次结构,编写可读性强、易于理解的代码变得更加重要。
此外,如果您仍想使用该数字并确保正确的数据类型,可以将其转换为整数。例如:
c.color = (COLOR)1;

2

CPP Reference网站上得知:

每个枚举类型都与以下类型之一兼容:char、带符号整数类型或无符号整数类型。对于任何给定的枚举类型,它与哪种类型兼容是由实现定义的,但无论如何,它必须能够表示该枚举的所有枚举值。

将一个枚举类型赋值为整数值应该是可以的。


0
根据C99标准,枚举类型被视为整数类型:
“char”类型、有符号和无符号整数类型以及枚举类型被统称为“整数类型”。
该标准允许将整数赋值给枚举类型的变量,并指定编译器在发生这种情况时应发出警告:
实现可以在许多情况下生成警告,其中没有一个作为国际标准的一部分进行指定。以下是一些更常见的情况。
当将一个值赋给不属于该类型的枚举类型对象时,或者将一个具有相同类型的枚举常量、枚举对象或返回相同枚举类型的函数的值赋给它时(6.7.2.2)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接