为某些整数定义一个别名,可以用预处理指令#define来完成这项工作:
#define MON 1 #define TUE 2 #define WED 3 #define THU 4 #define FRI 5 #define SAT 6 #define SUN 7
在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型就是枚举类型,英文原型 enumerate v. 枚举,列举,历数。以下代码定义了这种新的数据类型 – 枚举型:
enum DAY{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
- 枚举型是一个集合,集合中的元素(枚举成员)是一些命名了的整型常量,元素之间用逗号隔开。
- DAY是一个自定义的标识符,可以看成这个集合的名字,是一个可选项,即可有可无的项。
- 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1.
- 可以人为设定枚举成员的值,从而自定义某个范围内的整数。
- 枚举类型是预处理指令#define的替代。
- 类型定义以分号结束。
方法一: 枚举类型的定义与枚举类型变量的声明分开
enum DAY{
MON = 1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY yesterday; //变量 yesterday 的类型为枚举型 enum DAY
enum DAY today;
enum DAY good_day, bad_day;
方法二: 枚举类型的定义与枚举类型变量的声明同时进行:
enum{ //跟第一个定义不同的是,此处的标号 DAY 省略,这是允许的。
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //变量 workday 的类型为 enum{...}
enum week { Mon = 1, Tue, Wed, Thu, Fri, Sat, Sun} days; //变量 days 的类型为枚举型 enum week
enum BOOLEAN { false, true } end_flag, match_flag; //定义枚举类型并声明了两个枚举类型的变量
方法三: 用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明:
typedef enum wd{ //跟第一个定义不同的是,此处的标号 DAY 省略,这是允许的。
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} Workday; //此处的 Workday 为枚举类型 enum{...} 的别名,注意和方法二中 workday 的区分
Workday today, tomorrow; //变量 today 和 tomorrow 的类型为枚举类型 Workday,也即 enum{...}。
- 上面代码第一行typedef enum后面的 wd可以省略。
注意: 不同的枚举类型中,不能存在同名的命名常量:
typedef enum { wed, thu, fri } Workday_1;
typedef enum { wed, sun, mon } Workday_1; //错误,Workday_1和Workday_2中定义了同名的命名常量
3、使用枚举类型的变量
3.1 对枚举类型的变量赋值
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY yesterday, today, tomorrow; //声明枚举类型变量
yesterday = SAT; //对枚举型变量赋值
today = SUN; //对枚举型变量赋值
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };
enum DAY yesterday = SAT,
today = SUN; //声明变量的同时赋初值
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today;
yesterday = SAT,
today = SUN;
enum DAY{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} yesterday = SAT, today = SUN;
3.2 对枚举类型的变量赋整数值时,需进行强制类型转换
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today;
enum DAY yesterday, today, tomorrow;
yesterday = (enum DAY) 30; //这个是允许的,强制类型转换得以使用了枚举体定义之外的值
today = 3
3.3 使用枚举类型的变量
enum{
BELL = 'a', //注意有逗号
NEWLINE = 'n' //注意没逗号
};
printf("%c %c", BELL, NEWLINE);
4、枚举类型与sizeof运算符
#includeenum escapes { BELL = 'a', BACKSPACE = 'b', HTAB = 't', RETURN = 'r', NEWLINE = 'n', VTAB = 'v', SPACE = ' ' }; enum BOOLEAN { FALSE = 0, TRUE } match_flag; void main() { printf("%d bytes n", sizeof(enum escapes)); //4 bytes printf("%d bytes n", sizeof(escapes)); //4 bytes printf("%d bytes n", sizeof(enum BOOLEAN)); //4 bytes printf("%d bytes n", sizeof(BOOLEAN)); //4 bytes printf("%d bytes n", sizeof(match_flag)); //4 bytes printf("%d bytes n", sizeof(SPACE)); //4 bytes printf("%d bytes n", sizeof(NEWLINE)); //4 bytes printf("%d bytes n", sizeof(FALSE)); //4 bytes printf("%d bytes n", sizeof(0)); //4 bytes }
运行结果如下图:
Dev c++ 配置如下图:
Dev c++ 配置如下图32-bit时,上述代码大运行结果仍不变:



