C语言学习之枚举类型
前言

枚举(enum)类型是计算机编程语言中的一种数据类型。枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等。如果把这些量说明为整型,字符型或其它类型显然是不妥当的。为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。
枚举类型的定义
枚举类型定义的一般形式为:
enum 枚举名
{
枚举值表
};
在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。
例如:
enum weekday
{
Mon, Tues, Wed, Thurs, Fri, Sat, Sun
};
该枚举名为weekday,枚举值共有7个,即一周中的七天。凡被说明为weekday类型变量的取值只能是七天中的某一天。
像上面那样,当不写对应的值,枚举值默认从0开始,即等同于:
enum weekday
{
Mon = 0,
Tues = 1,
Wed = 2,
Thurs = 3,
Fri = 4,
Sat = 5,
Sun = 6
};
当然,也可以像这样简写:
enum weekday
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
};
这样枚举值就会从0开始递增,和上面的写法是一样的。
枚举变量的说明
如同结构体(struct)和共用体(union)一样,枚举变量也可用不同的方式说明,即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
enum weekday{sun,mon,tue,wed,thu,fri,sat}; //定义枚举类型
enum weekday a,b,c; //定义3个枚举类型的变量
enum weekday{sun,mon,tue,wed,thu,fri,sat}a,b,c; //定义枚举类型的同时,定义3个变量
enum{sun,mon,tue,wed,thu,fri,sat}a,b,c; //枚举名可省略,但后面不能再定义新的枚举变量
用typedef把枚举类型定义一个别名
typedef enum weekday //此处的weekday为枚举名
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
}weekday; //此处的weekday为enum weekday的别名
weekday today, tomorrow; //枚举类型的变量,即enum weekday类型
当然枚举名也可以省略:
typedef enum //省略枚举名
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
}weekday; //此处的weekday为枚举类型的别名
weekday today, tomorrow; //枚举类型的变量,即enum weekday类型
但是不可以省略类型别名:
typedef enum weekday
{
Mon = 0,
Tues,
Wed,
Thurs,
Fri,
Sat,
Sun
};
weekday today, tomorrow; //Code::Blocks环境报错
内存的分配
enum是枚举型,所占内存空间恒等于4字;union是共用体,成员共用一个变量缓冲区。
注意
1.不能定义同名的枚举的类型,如:
typedef enum
{
wednesday,
thursday,
friday
} workday; //定义了一个枚举类型,别名为workday
typedef enum WEEK
{
saturday,
sunday = 0,
monday,
} workday; //定义了一个枚举类型,别名为workday,重复了
2.不能包含同名的枚举成员
typedef enum
{
wednesday, //成员重复
thursday,
friday
} workday_1;
typedef enum WEEK
{
wednesday,
sunday = 0,
monday,
} workday_2;
3.对枚举型的变量赋整数值时,需要进行类型转换。
在Code::Blocks环境测试并不需要进行强制转换,无警告,无错误
单片机开发过程中常用的几个枚举类型
typedef enum {RESET = 0, SET = !RESET} FlagStatus, ITStatus;
typedef enum {DISABLE = 0, ENABLE = !DISABLE} FunctionalState;
typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrorStatus;
#define IS_FUNCTIONAL_STATE(STATE) (((STATE) == DISABLE) || ((STATE) == ENABLE))
参考资料:
Jlink使用技巧系列文章:
- Jlink使用技巧之合并烧写文件
- Jlink使用技巧之烧写SPI Flash存储
- Jlink使用技巧之虚拟串口功能
- Jlink使用技巧之读取STM32内部的程序
- Jlink使用技巧之J-Scope虚拟示波器功能
- Jlink使用技巧之单独下载HEX文件到单片机
欢迎大家关注我的个人博客
或微信扫码关注我的公众号

C语言学习之枚举类型的更多相关文章
- c语言学习笔记 - 枚举类型
今天学习了c语言的枚举类型的使用,可能是PHP里没使用过,开始看的时候还是觉得有点怪,后来做了下例子才理解,这里做个笔记记录一下. #include <stdio.h> enum anim ...
- C语言学习笔记--枚举&结构体
枚举 枚举是一种用户定义的数据类型,它用关键字enum以如下语法格式来声明: enum 枚举类型名字 {名字0,名字1,...,名字n}: 枚举类型名字通常并不真的使用,要用的是大括号里面的名字,因为 ...
- 【C语言学习】存储类型
C语言中的存储类型主要有四种:auto.static.extern.register ★auto存储类型 默认的存储类型.在C语言中,假设忽略了变量的存储类型,那么编译器就会自己主动默认为auto型 ...
- Java学习笔记-枚举类型
枚举类型 枚举类型就是预先定义的一类常量集合,如一周的时间.水果的类型等.需要注意的几点内容如下: 定义枚举类时,Java默认继承java.lang.Enum,所以定义的枚举类不能继承其他类型: 枚举 ...
- java基础知识学习--------之枚举类型(1)
枚举类型的概念: /** * 目的:枚举类型 * @author chenyanlong * 日期:2017/10/22 * 网址:http://blog.csdn.net/sup_heaven/ar ...
- Java编程思想学习笔记——枚举类型
前言 关键字enum可以将一组具名的值有限集合创建一种为新的类型,而这些具名的值可以作为常规的程序组件使用. 正文 基本enum特性 调用enum的values()方法可以遍历enum实例,value ...
- C语言学习之联合类型
前言 联合(union)是一种特殊的数据类型,和结构体很像,结构体各成员变量有自己独立的存储位置,而联合的成员变量共享同一片存储区域,因此联合变量再一个时刻只能保存它的某一个成员的值. 联合的定义和初 ...
- GO语言学习笔记2-int类型的取值范围
相比于C/C++语言的int类型,GO语言提供了多种int类型可供选择,有int8.int16.int32.int64.int.uint8.uint16.uint32.uint64.uint. 1.i ...
- C语言--enum,typedef enum 枚举类型详解
原文:http://z515256164.blog.163.com/blog/static/32443029201192182854300/ 有改动 C语言详解 - 枚举类型 注:以下全部代码的执行环 ...
随机推荐
- 在 Azure Resource Manager 中为虚拟机设置密钥保管库
Note Azure 具有两种不同的部署模型,用于创建和处理资源:Resource Manager 模型和经典模型.本文介绍使用 Resource Manager 部署模型.Azure 建议对大多数新 ...
- IntelliJ IDEA2018激活方法
前言: IntelliJ IDEA2018请在官网下载:https://www.jetbrains.com/idea/ 一.license server激活 输入http://idea.jialeen ...
- MySQL: Connection Character Sets and Collations
character_set_server collation_servercharacter_set_databasecollation_database character_set_clientch ...
- linux内核完全剖析——基于0.12内核-笔记(1)-CPU 数据通信
CPU数据通信总线 CPU通过地址线.数据线.控制信号组成的本地总线(或称为内部总线)与系统其它部分进行数据通信. 地址总线 地址总线用于内存或I/O设备的地址,即指明需要读/写数据的具体位置. 数据 ...
- python基础学习21----进程
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程. 进程与线程的使用有很多相似之处,有关线程方面的知识请参考https://w ...
- 2018.09.01 09:08 Genesis
Nothing to think about, I don't know where to start, the mastery of learning is not an easy task, yo ...
- Python学习(七)面向对象 ——继承和多态
Python 类的继承和多态 Python 类的继承 在OOP(Object Oriented Programming)程序设计中,当我们定义一个class的时候,可以从某个现有的class 继承,新 ...
- runloop是iOS系统上的actor模式
runloop是iOS系统上的actor模式(单线程派发的)
- 敲代码非常难之logstash之file input插件实现分析
版权声明:本文为横云断岭原创文章,未经博主同意不得转载.微信公众号:横云断岭的专栏 https://blog.csdn.net/hengyunabc/article/details/25665877 ...
- C语言编程积累2
版权声明:本文为CSDN博主(天才2012)原创文章,未经博主同意不得转载. https://blog.csdn.net/gzzaigcn/article/details/27113957 寥寥数笔, ...