我写了这个简单的代码来测试枚举,但是感觉不像是现实世界中可以使用的任何东西。我想知道枚举的一些很好的示例用例,以及它为什么有用的原因。
#include <stdio.h>
typedef enum {
BLUE,
GREEN,
BROWN
} eye_color;
typedef struct {
char *name;
char *eyecolor;
int height;
int weight;
eye_color eyes;
} person;
void print_eye_color(person p)
{
switch(p.eyes) {
case BLUE :
// I didn't know what else to say...
printf("%s eyes are made from diamonds\n", p.eyecolor);
break;
case GREEN :
printf("%s eyes are made from emeralds\n", p.eyecolor);
break;
case BROWN :
printf("%s eyes are made from amber\n", p.eyecolor);
default :
printf("What colour eyes do you have?\n");
}
}
int main()
{
person ayla = {"Ayla", "Blue", 167, 42, BLUE};
print_eye_color(ayla);
return 0;
}
答案 0 :(得分:2)
如果我想写纸牌游戏,我将使用一个枚举来表示纸牌的颜色,值和类型。
所以我会有类似的东西:
typedef enum {
KING, QUEEN, ACE, JACK, TEN, NINE, EIGHT, SEVEN, SIX, FIVE, FOUR, THREE, TWO
} card_value;
typedef enum {
SPADE, HEART, DIAMOND, CLUB
} card_type;
typedef enum {
BLACK, RED
} card_color;
这与这样做相反:
const int CARD_COLOR_RED = 1;
或更糟
const char* CARD_COLOR_RED = "Red";
枚举是自我记录-我不需要知道枚举RED
代表什么值,我只需要知道它是RED
。>
这也减少了编写代码的时间(程序员效率),因为您不必考虑分配给常量的值,因为事实证明,您给它的名称就是您希望它包含的值第一名。
枚举类似于erlang中的原子。
答案 1 :(得分:2)
枚举通过为数字赋予标识和名称来帮助避免“幻数”。您可以省略该数字,编译器将自动生成一个序列,但是您也可以自己为每个名称分配值。
示例:
typedef enum {
red = 0xff0000,
green = 0x00ff00,
blue = 0x0000ff,
magenta = 0xff00ff,
yellow = 0xffff00,
cyan = 0x00ffff,
white = 0xffffff,
black = 0x000000
} colors_24bit;
枚举有很多用例,但它们的最终目的是帮助您使代码清晰易懂。