我可以用枚举变量做什么?

dri*_*ker 9 c variables enums typedef definition

当我声明这样的枚举变量时:

enum paint_colors { RED, GREEN, BLUE, ...} colors;
Run Code Online (Sandbox Code Playgroud)

colors可变的有用吗?如果是这样,我该怎么办呢?

提前致谢.

Car*_*rum 13

你在那里真正做的是声明一个变量内联枚举的其余定义.它相当于:

enum paint_colors { RED, GREEN, BLUE };
enum paint_colors colors;
Run Code Online (Sandbox Code Playgroud)

通常,您会看到typedef与定义相关联的内容:

typedef enum _paint_colors { RED, GREEN, BLUE } paint_colors;
Run Code Online (Sandbox Code Playgroud)

这使您可以更像内置类型使用枚举:

paint_colors color;
Run Code Online (Sandbox Code Playgroud)

因此,您的问题的答案是colors类型的变量enum paint_colors,并且可以以您认为适合此类变量的任何方式使用:

colors = RED;
if (colors != GREEN)
{
    colors = BLUE;
}
Run Code Online (Sandbox Code Playgroud)

等等.

  • 你现在问两个问题._variable_'colors'是否有用,取决于程序的其余部分._type_'enum paint_colors'很有用,因为它传达了这个变量和其他变量的意图和值范围 - 它更强调什么('这是3种颜色之一'),而更少强调如何('这是存储的'作为一个int'). (2认同)

bta*_*bta 10

在内部,a enum被视为一个只能容纳有限范围值的整数.在这种情况下,常数RED,GREEN,BLUE,...将被定义和将等于0,1,2,...(分别地).该变量colors可以在任何可以使用的地方int使用.您可以使用运算符++来遍历颜色列表.声明之间的唯一区别enum paint_colors colorsint colors是所列举的变量可以被分配枚举常数之一.

这给你一些好处比使用#define创造了一系列的常量和使用正常int进行colors.首先,一些调试器可以检测到colors枚举类型,并显示枚举常量的名称而不是数值.

更重要的是,这可以添加额外的类型检查层.它不是C标准所要求的,但是一些编译器检查并确保分配给枚举类型变量的值对应于枚举常量之一.

在心理上,你几乎可以想到这类似于说:

#define RED    0
#define GREEN  1
#define BLUE   2
typedef int paint_colors;
paint_colors colors;
Run Code Online (Sandbox Code Playgroud)

变量被视为一个int,但明确地给它一个不同的类型有助于澄清变量是什么以及它用于什么.