C语言enum枚举类型解析

1.基础 在实际应用中,有的变量只有几种可能取值。如人的性别只有两种可能取值,星期只有七种可能取值。在 C 语言中对这样取值比较特殊的变量可以定义为枚举类型。所谓枚举是指将变量的值一一列举出来,变量只限于列举出来的值的范围内取值。 定义一个变量是枚举类型,可以先定义一个枚举类型名,然后再说明这个变量是该枚举类型。 例如: enum weekday{sun,mon,tue,wed,thu,fri,sat}; 定义了一个枚举类型名 enum weekday,然后定义变量为该枚举类型。例如: enum weekday day; 当然,也可以直接定义枚举类型变量。例如: enum weekday{sun,mon,tue,wed,thu,fri,sat} day; 其中,sum,mon,…,sat 等称为枚举元素或枚举常量,它们是用户定义的标识符。 需要说明的有以下几点。 ① 枚举元素不是变量,而是常数,因此枚举元素又称为枚举常量。因为是常量,所以不能对枚举元素进行赋值。 ② 枚举元素作为常量,它们是有值的,C 语言在编译时按定义的顺序使它们的值为,1,2,…。 在上面的说明中,sun 的值为 0,mon 的值为 1,…sat 的值为 6,如果有赋值语句 day=mon; 则 day 变量的值为 1。当然,这个变量值是可以输出的。例如: printf ("%d",day); 将输出整数 1。 如果在定义枚举类型时指定元素的值,也可以改变枚举元素的值。例如: enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day; 这时,sun 为 7,mon 为 1,以后元素顺次加 1,所以 sat 就是 6 了。 ③ 枚举值可以用来作判断。例如: if (day==mon) {…} if (day>mon) {…} 枚举值的比较规则是:按其在说明时的顺序号比较,如果说明时没有人为指定,则第一个枚举元素的值认作 0。例如,mon>sun,sat>fri。 C 语言教程 ?216? ④ 一个整数不能直接赋给一个枚举变量,必须强制进行类型转换才能赋值。例如: day=(enum weekday)2; 这个赋值的意思是,将顺序号为 2 的枚举元素赋给 day,相当于workday=tue; 【例 】从键盘输入一个整数,显示与该整数对应的枚举常量的英文名称。 # include void main( ) { enum weekday {sun,mon,tue,wed,thu,fri,sat} day; int k; printf("input a number(0--6)"); scanf("%d",&k); day=(enum weekday)k; switch(day) { case sun: printf("sunday/n");break; case mon: printf("monday/n");break; case tue: printf("tuesday/n");break; case wed: printf("wednesday/n");break; case thu: printf("thursday/n");break; case fri: printf("friday/n");break; case sat: printf("satday/n");break; default: printf("input error/n");break; } } 程序运行结果为: input a number(0--6)1 monday 在该程序中,枚举常量与枚举变量可以进行比较,但要输出枚举常量对应的英文单词,不能使用以下语句: printf(" %s",mon); 因为枚举常量 mon 为整数值,而非字符串。 在使用枚举变量时,主要关心的不是它的值的大小,而是其表示的状态。 (1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。 (2) DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。 (3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。 (4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。 (5) 枚举型是预处理指令#define的替代。 (6) 类型定义以分号;结束。 2. 注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示: 错误声明一:存在同名的枚举类型 typedef enum { 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.使用枚举型变量 #include 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] != '/0'; 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 times count of letters: 10 Press any key to continue 4. 枚举类型与sizeof运算符 #include 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 } 5. 综合举例 #include 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 summer/n"); // x is equal to summer printf("%d bytes/n", 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 }

转载于:https://www.cnblogs.com/guozhen2016/p/6343520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值