程序可能需要为几个整数定义别名。 您可以使用预处理指令#define执行此操作。 你的代码可能如下所示。
# definemon1# define tue # definewedw3# define thu! # define fri5# defines at6 # definesun 7在此定义新的数据类型,以便可以执行相同的操作。 这个新的数据类型称为枚举类型。
定义新的数据类型枚举类型以下代码定义这个新的数据类型枚举类型
enum DAY{ MON=1,TUE,WED,THU,FRI,SAT,SUN}; )枚举类型是集合,集合中的元素)枚举成员)是几个命名整数常量,元素之间用逗号分隔。
() DAY是标识符,可以被认为是这个集合的名称,是选择,是有无的项目。
(w3 )第一个枚举成员的默认值为整数0,后续枚举成员的值为上一个成员加1。
(! )可以人工设置枚举成员的值,以定制某个范围内的整数。
)5)枚举类型是预处理指令#define的替代。
)6)类型定义以分号结束。
完成使用枚举类型声明变量的新数据类型定义后,即可使用它。 我们看到了最基本的数据类型,如整数型int、单精度浮点型float、双精度浮点型double、字符型char和短整数型short。 用这些基本数据类型声明变量时,通常会出现以下情况:
字符; //变量L4A的类型均为字符类型charchar letter; intx、yo、 //变量、yo和类型均为整数intint number; 双精度、; 双结果; //既然变量result的类型是双精度浮点型双精度枚举也是数据类型,则也可以像声明基本数据类型一样声明变量。
方法1 :分离枚举类型的定义和变量的声明
enum DAY{ MON=1,TUE,WED,THU,FRI,SAT,SUN}; 事件日期历史; enum DAY today; enum DAY tomorrow; //变量tomorrow的类型为枚举类型enum DAYenum DAY good_day,bad_day; //变量good_day和bad_day的类型都是枚举类型enum DAY lydsy。 类型定义与变量声明同时进行。
enum //与初始定义不同的是,这里省略了符号DAY,这是允许的。 { saturday,sunday=0,monday,tuesday,wednesday,thursday,friday} workday; //变量workday的类型为枚举类型enum DAY 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 workday{ saturday,sunday=0,monday,tuesday,wednesday,thursday,friday} workday; //此处的workday是枚举型enum workday的别名workday today,tomorrow; //变量today和tomorrow的类型为枚举workday,也就是说可以省略enum workday enum workday的workday。 typedef enum{ saturday,sunday=0,monday,tuesday //此处的workday是枚举类型enum workday的别名workday,tomorrow; //变量today和tomorrow的类型为枚举型workday,也就是enum workday
也有这样的方法。
typedef enum workday{ saturday,sunday=0,monday,tuesday,wednesday,thursday,friday}; workday today,tomorrow; //变量today和tomorrow的类型为枚举类型workday。 这意味着枚举日注意:不能在同一程序中定义具有相同名称的枚举类型。 此外,不同的枚举类型也不能存在同名的命名常量。 错误的例子如下所示。
错误声明1 :存在同名的枚举类型
类型枚举
wednesday, thursday, friday} workday;typedef enum WEEK{ saturday, sunday = 0, monday,} workday;错误声明二:存在同名的枚举成员
typedef enum{ wednesday, thursday, friday} workday_1;typedef enum WEEK{ wednesday, sunday = 0, monday,} workday_2; 使用枚举类型的变量3.1 对枚举型的变量赋值。
实例将枚举类型的赋值与基本数据类型的赋值进行了对比:
方法一:先声明变量,再对变量赋值
#include<stdio.h>/* 定义枚举类型 */enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };void main(){ /* 使用基本数据类型声明变量,然后对变量赋值 */ int x, y, z; x = 10; y = 20; z = 30; /* 使用枚举类型声明变量,再对枚举型变量赋值 */ enum DAY yesterday, today, tomorrow; yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d n", yesterday, today, tomorrow);}lydsy:声明变量的同时赋初值
#include <stdio.h>/* 定义枚举类型 */enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };void main(){ /* 使用基本数据类型声明变量同时对变量赋初值 */ int x=10, y=20, z=30; /* 使用枚举类型声明变量同时对枚举型变量赋初值 */ enum DAY yesterday = MON, today = TUE, tomorrow = WED; printf("%d %d %d n", yesterday, today, tomorrow);}方法三:定义类型的同时声明变量,然后对变量赋值。
#include <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,它们都为全局变量 */enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } yesterday, today, tomorrow;/* 定义三个具有基本数据类型的变量,它们都为全局变量 */int x, y, z;void main(){ /* 对基本数据类型的变量赋值 */ x = 10; y = 20; z = 30; /* 对枚举型的变量赋值 */ yesterday = MON; today = TUE; tomorrow = WED; printf("%d %d %d n", x, y, z); //输出:10 20 30 printf("%d %d %d n", yesterday, today, tomorrow); //输出:1 2 3}方法四:类型定义,变量声明,赋初值同时进行。
#include <stdio.h>/* 定义枚举类型,同时声明该类型的三个变量,并赋初值。它们都为全局变量 */enum DAY{ MON=1, TUE, WED, THU, FRI, SAT, SUN }yesterday = MON, today = TUE, tomorrow = WED;/* 定义三个具有基本数据类型的变量,并赋初值。它们都为全局变量 */int x = 10, y = 20, z = 30;void main(){ printf("%d %d %d n", x, y, z); //输出:10 20 30 printf("%d %d %d n", yesterday, today, tomorrow); //输出:1 2 3}3.2 对枚举型的变量赋整数值时,需要进行类型转换。
#include <stdio.h>enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN };void main(){ enum DAY yesterday, today, tomorrow; yesterday = TUE; today = (enum DAY) (yesterday + 1); //类型转换 tomorrow = (enum DAY) 30; //类型转换 //tomorrow = 3; //错误 printf("%d %d %d n", yesterday, today, tomorrow); //输出:2 3 30}3.3 使用枚举型变量
#include<stdio.h>enum{ BELL = 'a', BACKSPACE = 'b', HTAB = 't', RETURN = 'r', NEWLINE = 'n', VTAB = 'v', SPACE = ' '};enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main(){ int index = 0; int count_of_letter = 0; int count_of_space = 0; char str[] = "I'm Ely efod"; match_flag = FALSE; for(; str[index] != ' '; index++) if( SPACE != str[index] ) count_of_letter++; else { match_flag = (enum BOOLEAN) 1; count_of_space++; } printf("%s %d times %c", match_flag ? "match" : "not match", count_of_space, NEWLINE); printf("count of letters: %d %c%c", count_of_letter, NEWLINE, RETURN);} 输出:match 2 timescount of letters: 10Press any key to continue 枚举类型与sizeof运算符 #include <stdio.h>enum 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} 综合举例 #include<stdio.h>enum Season{ spring, summer=100, fall=96, winter};typedef enum{ Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday}Weekday;void main(){ /* Season */ printf("%d n", spring); // 0 printf("%d, %c n", summer, summer); // 100, d printf("%d n", fall+winter); // 193 Season mySeason=winter; if(winter==mySeason) printf("mySeason is winter n"); // mySeason is winter int x=100; if(x==summer) printf("x is equal to summern"); // x is equal to summer printf("%d bytesn", sizeof(spring)); // 4 bytes /* Weekday */ printf("sizeof Weekday is: %d n", sizeof(Weekday)); //sizeof Weekday is: 4 Weekday today = Saturday; Weekday tomorrow; if(today == Monday) tomorrow = Tuesday; else tomorrow = (Weekday) (today + 1); //remember to convert from int to Weekday}