在枚举中使用实例化

  • 本文关键字:实例化 枚举 c
  • 更新时间 :
  • 英文 :


我正在研究枚举,我遇到了代码中枚举变量的实例化。但是枚举的工作状态非常好,没有实例化,就像此代码中:

#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不是。在您的示例中,您应该为枚举使用不同的名称。例如monthweek_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实际上没有强大的打字系统,因此它会自动将枚举值投入到intfloat,这就是为什么您可以做到这一点,但是正确的代码不应该这样做。

当您想拥有不同类型的某些东西时,您就会使用枚举,而无需打扰自己分配值...

例如,就像在代码中一样,您可以为所有月份创建变量名称,而这些变量的价值并不重要,您只知道Jan是Jan,就是这样。它的价值可以是任何东西,一个0,-42,甚至是4564798。唯一重要的事情是每次您在某处使用Jan时,值都会相同。

最新更新