一、关键字enum的定义

enum是C语言中的一个关键字,enum叫枚举数据类型,枚举数据类型描述的是一组整型值的集合(这句话其实不太妥当),枚举型是预处理指令#define的替代,枚举和宏其实非常类似,宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值,

我们可以将枚举理解为编译阶段的宏,使用格式:

enum typeName { valueName1, valueName2, valueName3, ...... };

typeName是枚举类型的名字,花括号里面的元素(枚举成员)是常量而不是变量,这个一定要搞清楚,因为枚举成员的是常量,所以不能对它们赋值,只能将它们的值赋给其他的变量。

枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。

接下来我们举个例子,比如:一星期有 7 天,如果不用枚举,我们需要使用 #define 来为每个整数定义一个别名:

#defineMON 1
#defineTUE 2
#defineWED 3
#defineTHU 4
#defineFRI 5
#defineSAT 6
#defineSUN 7

这个看起来代码量就比较多,接下来我们看看使用枚举的方式:

enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};

这样看起来是不是更简洁了。

需要注意的两点是:

1) 枚举列表中的 Mon、Tues、Wed 这些标识符的作用范围是全局的(严格来说是 main() 函数内部),不能再定义与它们名字相同的变量。

2) Mon、Tues、Wed 等都是常量,不能对它们赋值,只能将它们的值赋给其他的变量。

枚举和宏其实非常类似:宏在预处理阶段将名字替换成对应的值,枚举在编译阶段将名字替换成对应的值。我们可以将枚举理解为编译阶段的宏。

总结:

(1) 枚举型是一个集合,集合中的元素(枚举成员)是一些命名的整型常量,元素之间用逗号,隔开。

(2)DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项。

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。在当前值没有赋值的情况下,枚举类型的当前值总是前一个值+1.

(4) 可以人为设定枚举成员的值,从而自定义某个范围内的整数。

(5) 枚举型是预处理指令#define的替代。

(6) 类型定义以分号;结束。

二、枚举变量的定义

1、先定义枚举类型,再定义枚举变量

enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
};
enum DAY day;

2、定义枚举类型的同时定义枚举变量

enum DAY
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

3、省略枚举名称,直接定义枚举变量

enum
{
MON=1, TUE, WED, THU, FRI, SAT, SUN
} day;

注意:同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量。错误示例如下所示:

错误声明一:存在同名的枚举类型

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;

三、 使用枚举类型的变量

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);
}

方法二:声明变量的同时赋初值

#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
}

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.使用枚举型变量

#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] != '\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

四、 枚举类型的大小

#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
}

通过上面的实例,发现输出都为4。实际上,枚举类型在存储时,是按照int型存储的,在我的系统中也就是4字节方式存储。

五、综合举例

#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 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
}

六、枚举与#define 宏的区别

下面再看看枚举与#define 宏的区别:

1)#define 宏常量是在预编译阶段进行简单替换。枚举常量则是在编译的时候确定其值。

2)一般在编译器里,可以调试枚举常量,但是不能调试宏常量。

3)枚举可以一次定义大量相关的常量,而#define 宏一次只能定义一个。

C#关于枚举类型Enum的用法详解,很细相关推荐

  1. java 枚举类型enum的用法详解

    Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要 ...

  2. mysql 枚举 enum用法_mysql中的枚举类型ENUM的用法:

    mysql中的枚举类型ENUM的用法: (2010-06-18 13:44:13) mysql中的枚举类型ENUM的用法: mysql中的枚举类型ENUM是一个字符串对象,它的值是自表创建时在列规定中 ...

  3. mysql 枚举_详解MySQL数据类型之枚举类型ENUM的用法

    本节主要内容: MySQL数据类型之枚举类型ENUM MySQL数据库提供针对字符串存储的一种特殊数据类型:枚举类型ENUM,这种数据类型可以给予我们更多提高性能.降低存储容量和降低程序代码理解的技巧 ...

  4. 枚举类型Enum的用法

    一.枚举类型的基本概念        枚举常量是一种枚举类型中的值,及枚举值,枚举类型是由用户自定义的,只用用户在程序中定义它才能被使用. 创建一个枚举类型的基本语法: enum 枚举类型名{     ...

  5. Java enum的用法详解

    在JDK1.5 之前,我们定义常量都是: public static fianl.... .现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. public e ...

  6. 【Java】枚举(enum)机制 详解

    目录 1 背景及定义 2 使用 3 枚举优点和缺点 4 枚举和反射 5 重点 1 背景及定义 枚举是在JDK1.5以后引入的.主要用途是:将一组常量组织起来,在这之前表示一组常量通常使用定义常量的方式 ...

  7. java枚举(enum)使用详解

    文章目录 前言 一.枚举类型定义 二.访问成员 三.遍历 四.在switch()中使用枚举 五.方法 1.内置方法 1.1 ordinal()用于返回成员的索引 1.2 compareTo()用于比较 ...

  8. mysql枚举类型enum用法_mysql中枚举类型之enum详解

    enum类型就是我们常说的枚举类型,它的取值范围需要在创建表时通过枚举方式(一个个的列出来)显式指定,对1至255个成员的枚举需要1个字节存储: 对于255至65535个成员,需要2个字节存储.最多允 ...

  9. Java(enum)枚举用法详解

    转载自 Java(enum)枚举用法详解 本篇文章主要介绍了Java 枚举用法详解,枚举的好处:可以将常量组织起来,统一进行管理.有兴趣的可以一起来了解一下. 概念 enum的全称为 enumerat ...

最新文章

  1. 理解什么是MyBatis?
  2. acos1.2的下载及CentOS7下安装nacos1.2
  3. 2011年上海交通大学计算机研究生机试真题
  4. char数组转string_String类和其它数据类型的相互转换
  5. python :使用 __getitem__ 和 __iter__ 可以使类成为一个迭代器
  6. 安卓操作系统版本(Version)与应用程序编程接口等级(Application Programming Interface Level)对照表...
  7. java正则表达式匹配`\`
  8. 高职对计算机课程要求,高职计算机课程对学生编程能力培养.doc
  9. jquery中的ajax方法参数
  10. mybatis将字段改为null_【MyBatis入门到入土精讲】MyBatis介绍
  11. Guice 的工作原理
  12. React 环境 webpack less 配置 及 javascriptEnabled 解决方法
  13. presentation视频录制与编辑
  14. tableau免费版无法更新数据
  15. SetChatRoomDesc 设置群公告
  16. html图片自适应上下左右居中显示,图片大小自适应垂直居中的方法
  17. 机器人擂台的利剑_机器人大擂台2017
  18. iPhone12无法连接电脑的热点
  19. TestStand-数据类型
  20. 网络工程师考试复习心得

热门文章

  1. BIM+GIS可视化项目管理方案
  2. android onresume 焦点,Android – 是否有一个回调,在onResume()之后被调用?
  3. QT模态对话框及非模态对话框学习
  4. 安装、卸载nginx(基于Centos7)
  5. 设计模式之七大原则分析与总结
  6. [附源码]Nodejs计算机毕业设计基于Java的健身房管理系统Express(程序+LW)
  7. Java中的synthetic详解
  8. Java几种生成synthetic方法的情况
  9. java魅族面试题_魅族2016Java互联网方向其中一道笔试题--青蛙跳台阶问题
  10. 创意美术的魅力到底有多大?