我正在研究枚举,我遇到了代码中枚举变量的实例化。但是枚举的工作状态非常好,没有实例化,就像此代码中:
#include<stdio.h>
enum year{Jan, Feb, Mar, Apr, May, Jun, Jul,Aug, Sep, Oct, Nov, Dec};
int main()
{
int i;
for (i=Jan; i<=Dec; i++)
printf("%d ", i);
return 0;
}
,输出为:
0 1 2 3 4 5 6 7 8 9 10 11
因此,声明变量的用法和在枚举类型中的用途是什么?如果愿意,我可以在int或float中声明它,这很好。这可能是一个天真的问题,但我无法获得此功能的实际应用。
#include<stdio.h>
enum week{Mon, Tue, Wed, Thur, Fri, Sat, Sun};
int main()
{
enum week day;
day = Wed;
printf("%d",day);
return 0;
}
Jan
显然是(?(一个月, 0
根本不清楚。
然后,假设您选择有意义的名称,它也可以作为类型注释。year
是清晰的(或者如果选择了好名字,则int
不是。在您的示例中,您应该为枚举使用不同的名称。例如month
和week_day
。
最后,在您的示例中,它们并不是代表整数值(除非您需要计算,否则像几个月之间的差异一样(。因此,仅将它们打印为数字并没有很多意义。
请参见下面的示例,以了解enum
S可能非常有帮助。
还请注意,您可以添加更多水果。实际上,您只需要将其添加到enum
的定义和名称数组。
#include <stdio.h>
#include <errno.h>
enum Fruit
{
Fruit_Undefined = -1,
Apple,
Orange,
Pear,
Fruit_Maximum
};
const char * names_of_fruits[Fruit_Maximum] =
{
"Apple",
"Orange",
"Pear",
};
const char * get_name_of_fruit(enum Fruit fruit)
{
const char * result = NULL;
if (Fruit_Undefined >= fruit || Fruit_Maximum <= fruit)
{
errno = EINVAL;
}
else
{
result = names_of_fruits[fruit];
}
return result;
}
int main(void)
{
for (enum Fruit fruit = Fruit_Undefined;
fruit <= Fruit_Maximum;
++fruit)
{
const char * name = get_name_of_fruit(fruit);
if (NULL == name)
{
perror("get_name_of_fruit() failed");
}
else
{
puts(name);
}
}
}
编译,运行并获得:
get_name_of_fruit() failed: Invalid argument
Apple
Orange
Pear
get_name_of_fruit() failed: Invalid argument
确保这也可以通过int
S和define
S完全完成。
枚举类型使其与不一定订购的事物类别的模型变得容易,例如
enum fish {salmon, tuna, cod, halibut, grouper};
enum genre {drama, comedy, action, horror, scifi};
您可以使用枚举常数而无需创建该类型的对象 - 它用于建模错误代码和类似的内容。
是的,您可以使用常规整数常数建模这些东西:
const int salmon = 0;
const int tuna = 1;
...
或预处理器宏:
#define SALMON 0
#define TUNA 1
...
枚举类型只会使过程变得更加容易,更直观。
应该指出,C的枚举抽象是"泄漏"的。理想情况下,enum fish
类型的对象应仅能够在枚举中指定的值(以Java等较新的语言就是这种情况(。但是,由于C的枚举类型基本上是int
,因此enum fish
类型的对象可以使用任何 int
值,因此它并不像抽象那样有用。
Enum
用来枚举某些东西,就像您拥有的代码可以允许您枚举天不关心变量的真实值是什么,只要您不修改它们他们自己,它们都是独一无二的,这就是您想要的。
c中的枚举是整体类型,并且由于C实际上没有强大的打字系统,因此它会自动将枚举值投入到int
或float
,这就是为什么您可以做到这一点,但是正确的代码不应该这样做。
当您想拥有不同类型的某些东西时,您就会使用枚举,而无需打扰自己分配值...
例如,就像在代码中一样,您可以为所有月份创建变量名称,而这些变量的价值并不重要,您只知道Jan是Jan,就是这样。它的价值可以是任何东西,一个0,-42,甚至是4564798。唯一重要的事情是每次您在某处使用Jan
时,值都会相同。