天天看点

C / C++系列 (2):枚举enum定义枚举定义枚举变量枚举 vs. 共用体 & 结构体

enum

  • 定义枚举
  • 定义枚举变量
    • enum
    • int vs. enum
  • 枚举 vs. 共用体 & 结构体

定义枚举

由于在实际的编程中使用宏定义会使代码的阅读性变高,所以应该多采用宏定义进行赋。

但是在实际的应用中 有着这样的问题:如果对于周一到周日需要定义1-7,一共7个define语句:

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7
           

一看就不太美观,所以枚举就出来了枚举的定义如下:

所以将上述的宏定义可以改写为:

enum DAY{
    MON, TUE, WED, THU, FRI, SAT, SUN
};
           

可以看到在enum内只写了名字,并没有写数值,这是因为在枚举内如果没有写数值他的默认数值是0开始。所以周一到周日是从0 ~ 6。

若要把其改写为1 ~ 7,只需要做以下改动:

enum DAY{
    MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
           

从中只改变了MON的值,MON ~ SUN的值变成了1 ~ 7。

再举个栗子:

enum Day{
    MON, TUE, WED, THU = 5, FRI, SAT, SUN
};
           

照规律,MON ~ WED为0 ~ 2,THU ~ SUN 为 5 ~ 8。

这些宏定义在定义时刻就生效了,并且在之后的程序中不可被更改(道理相当于宏定义)

定义枚举变量

enum

和共用体和结构的使用方式类似。有以下三种方式:

1、先定义枚举类型,再定义枚举变量

enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;
           

2、定义枚举类型的同时定义枚举变量

enum DAY{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           

3、省略枚举名称,直接定义枚举变量

enum{
    MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;
           

在使用的过程中应该注意的是以下几点:

  1. 在C语言中枚举变量被当做int类型或者unsigned int类型进行处理
  2. 在赋值的时候可以赋值一个整数也可以赋值该枚举变量对应的枚举类型成员,但是其他枚举类型成员不能被使用
  3. 进行部分数据操作的时候不能使用不同类型的枚举变量进行操作。比如:“ == “(” + “这一类可以)

int vs. enum

在C 语言中,枚举类型是被当做 int 或者 unsigned int 类型来处理的。但是为什么要用枚举变量呢。这是由于在开发的时候经常用int类型来定义一个整形变量。类比于枚举这算一种int枚举模式,这里使用以下例子进行分析:

int Day_MON = 1;
...
int Day_SUN = 1;

int Mon_Jan = 1;
...
int Mon_Dec = 12;
           

int 的缺点:

  1. 在不同的枚举类型(Day & Mon)之间相互传递信息,编译器不会警告,执行也不会出现错误;
  2. 用==操作符将Day与Mon比较,编译器不会警告,执行也不会出现错误;
  3. int枚举是编译时常量,在之后的操作中可被更改。
  4. 将int枚举常量翻译成可打印的字符串很麻烦
  5. 如果想要遍历一个组中的所有int 枚举常量,很困难。

所以采用枚举就能规避这个缺点。枚举类型还允许添加任意的方法和域,并且还有两点好处:

enum Day{     
    MON, TUE, WED, THU, FRI, SAT, SUN
};
enum Mon {
   Jan, Feb, Mar, Apr, May, June, July, Aug, Sept, Oct, Nov, Dec
};
enum Mon mon;
// mon = FRI;     // error
// 
           

enum的优点:

  1. 能够将数据与它的常量关联起来
  2. 可使用适当的方法来增强枚举类型,枚举类型可以先作为枚举常量的一个简单集合,随着时间的推移在演变成为全功能的抽象。
  3. 克服以上int的缺点

枚举 vs. 共用体 & 结构体

结构体是一种构造类型,它的每一个成员都可以是一个基本的数据类型或者又是一个构造类型(结构体的嵌套使用),它的所有成员都能共存,这也是它和共用体和枚举类型的最大区别。它的简单定义如下:

struct Num{    
   char i;
   int j;
   struct add;
}
           

共用体每一个定义的变量,它们的变量值是可以改变的,但它们的数据类型是不能改变的,共用体就是一种可以在同一存储区域变成不同数据类型的一种数据类型。它采用的是覆盖存储技术,准许不同的数据类型相互覆盖。它的简单定义如下:

union Num{    
    char i;
    int  j;    
    struct add;
}
           

枚举类型仅仅适用取值于有限的数据,它里面的标识符是常量不是变量,不能改变他的值,枚举元素只能是标识符,不能是基本类型常量(宏定义),枚举变量被当做int类型来对待,它的简单定义如下:

enum{
    sun,
    mon,
    ...
}
           

继续阅读