攻城军师
最后登录1970-1-1
在线时间 小时
注册时间2014-8-6
|
本帖最后由 ii童话Bū说话 于 2014-8-14 18:28 编辑
枚举是一种数据类型
定义:是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内.
在C语言等计算机编程语言中是一种构造数据类型。
它用于声明一组命名的常数,当一个变量有几种可能的取值时,可以将它定义为枚举类型。
枚举变量:指用枚举类型定义的变量.变量和参数都可以定义为枚举类型.过程的返回值也可以是枚举类型.
枚举成员:枚举成员是该枚举类型的命名常数。任意两个枚举成员不能具有相同的名称。
每个枚举成员均具有相关联的常数值。此值的类型就是枚举的基础类型。每个枚举成员的常数值必须在该枚举的基础类型的范围之内。
他们是不能进行普通的算术赋值的,(pencil=1;)这样的写发是错误的,但是你可以在声明的时候进行赋值操作!
例如:- enum Port
- {
- PTA0, PTA1, PTA2, PTA3, PTA4, PTA5,
- PTA6=1, PTA7, PTA8, PTA9, PTA10,
- PTA11, PTA12, PTA13, PTA14, PTA15,
- PTA16, PTA17, PTA18, PTA19, PTA20,
- } PTXn_e;
复制代码 在枚举类型中声明的第一个枚举成员它的默值为零。以后的枚举成员值是将前一个枚举成员(按照文本顺序)的值加 1 得到的。
所以,PTA0=0,PTA1=1,PTA2=2,PTA3=3,PTA4=4,PTA5=5,
PTA6=1(赋值),PTA7=2,PTA8=3,PTA4=4……
/*截图是快要出版的k60书(山外哥提供)*/
基础类型必须能够表示该枚举中定义的所有枚举数值。
枚举声明可以显式地声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 类型作为对应的基础类型。
没有显式地声明基础类型的枚举声明意味着所对应的基础类型是 int。
枚举是一种数据类型,所以他和基本数据类型一样也可以对变量进行声明。
方法一:枚举类型的定义和变量的声明分开 - enum Port
- {
- PTA0, PTA1, PTA2, PTA3, PTA4, PTA5,
- PTA6, PTA7, PTA8, PTA9, PTA10,
- PTA11, PTA12, PTA13, PTA14, PTA15,
- PTA16, PTA17, PTA18, PTA19, PTA20, /*枚举成员*/
- };
- enum Port LED1;//枚举类型为enum Port 的变量LED1
- enum Port LED2;//LED2的变量类型为 enum Port
- LED1=PAT0;//变量LED1的值为0
- LED2=PAT6;//变量LED2的值为6
复制代码方法二:类型定义与变量声明同时进行: - enum Port
- {
- PTA0, PTA1, PTA2, PTA3, PTA4, PTA5,
- PTA6, PTA7, PTA8, PTA9, PTA10,
- PTA11, PTA12, PTA13, PTA14, PTA15,
- PTA16, PTA17, PTA18, PTA19, PTA20, /*枚举成员*/
- }LED1,LED2;//变量LED1,LED2的类型为枚举型enum Port
- LED1=PTA0;
- LED2=PTA6;
复制代码方法三:用typedef关键字将枚举类型定义成别名,并利用该别名进行变量声明: - typedef enum Port
- {
- PTA0, PTA1, PTA2, PTA3, PTA4, PTA5,
- PTA6, PTA7, PTA8, PTA9, PTA10,
- PTA11, PTA12, PTA13, PTA14, PTA15,
- PTA16, PTA17, PTA18, PTA19, PTA20,
- } PTXn_e;
-
- enum Port LED1;
- LED1=PTA0;
-
- PTXn_e LED2;
- LED2=PTA1;
复制代码 个人理解:因为关键字 typedef 的存在,使得 enum Port 等价于 PTXn_e
typedef 的作用,我理解的是 相当于别人给自己起的小名(或者外号)。
此处 PTXn_e 等价于 enum Port ,用法类似于宏定义。
注意:宏定义在预编译阶段, typedef 在编译时被解释。对于 enum 在 预编译阶段也是被跳过的!!!
但是它本身是一种存储类的关键字,所以与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
关键字 typedef 的详细用法介绍移步 http://www.firebbs.cn/forum.php?mod=viewthread&tid=399
注:在K60的程序中的典型用法为: 节选自K60的LED程序中的 FIRE_LED.H
- #ifndef __FIRE_LED_H__
- #define __FIRE_LED_H__
- /*! 枚举LED编号 */
- typedef enum
- {
- LED0,
- LED1,
- LED2,
- LED3,
- LED_MAX,
- }LED_e;
- /*! 枚举LED亮灭状态 */
- typedef enum LED_status
- {
- LED_ON = 0, //灯亮(对应低电平)
- LED_OFF = 1 //灯暗(对应高电平)
- }LED_status;
- extern void led_init(LED_e); //初始化LED端口
- extern void led(LED_e,LED_status); //设置LED灯亮灭
- extern void led_turn(LED_e); //设置LED灯亮灭反转
- #endif //__FIRE_LED_H__
复制代码
也可以: - typedef enum
- {
- LED0,
- LED1,
- LED2,
- LED3,
- LED_MAX,
- }LED_e;//此时的LED_e是枚举型为 enum LED_e 的别名(外号)
复制代码 山外哥出的每日一题!测试一下!
http://www.firebbs.cn/forum.php?mod=viewthread&tid=1183&highlight=typedef
|
|