C语言枚举类型举例

注:以下全部代码的执行环境为VC++ 6.0

宏和枚举的区别

宏和枚举之间的差别主要在作用的时期和存储的形式不同,宏是在预处理的阶段进行替换工作的,它替换代码段的文本,程序运行的过程中宏已不存在了。而枚举是在程序运行之后才起作用的,枚举常量存储在数据段的静态存储区里。宏占用代码段的空间,而枚举除了占用空间,还消耗CPU资源。

但也不能就此说宏比枚举好,如果需要定义非常多的常量,用一条enum {.....}明显比一大堆define更清晰,枚举也可以用来定义一些特殊类型,比如Bool,

如: type enum {FALSE,TRUE} Bool;

在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#define来完成这项工作,您的代码可能是:

#define MON  1

#define TUE   2

#define WED  3

#define THU   4

#define FRI    5

#define SAT   6

#define SUN   7

在此,我们定义一种新的数据类型,希望它能完成同样的工作。这种新的数据类型叫枚举型。

1. 定义一种新的数据类型 - 枚举型

以下代码定义了这种新的数据类型 - 枚举型

enum DAY

{

MON=1, TUE, WED, THU, FRI, SAT, SUN

};

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

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

(3) 第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员上加1。

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

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

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

2. 使用枚举类型对变量进行声明

新的数据类型定义完成后,它就可以使用了。我们已经见过最基本的数据类型,如:整型int, 单精度浮点型float, 双精度浮点型double, 字符型char, 短整型short等等。用这些基本数据类型声明变量通常是这样:

char     a; //变量a的类型均为字符型char

char     letter;

int        x,  y,  z; //变量x,y和z的类型均为整型int

int       number;

double   m, n;

double  result; //变量result的类型为双精度浮点型double

既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明。

方法一:枚举类型的定义和变量的声明分开

enum DAY

{

MON=1, TUE, WED, THU, FRI, SAT, SUN

};

enum DAY yesterday;

enum DAY today;

enum DAY tomorrow; //变量tomorrow的类型为枚举型enum DAY

enum DAY good_day, bad_day; //变量good_day和bad_day的类型均为枚举型enum DAY

方法二:类型定义与变量声明同时进行:

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,

wednesday,

thursday,

friday

} workday; //此处的workday为枚举型enum workday的别名

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

也可以用这种方式:

typedef enum workday

{

saturday,

sunday = 0,

monday,

tuesday,

wednesday,

thursday,

friday

};

workday today, tomorrow; //变量today和tomorrow的类型为枚举型workday,也即enum workday

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

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

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

3.1 对枚举型的变量赋值。

实例将枚举类型的赋值与基本数据类型的赋值进行了对比:

方法一:先声明变量,再对变量赋值

#include

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

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

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

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

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

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

typedef   struct   weekday_st

{

enum   week  {sun=123456789,mon,tue,wed,thu,fri,sat };

enum   day   {monring,   moon,   aftermoon} ;

}weekday_st;

int   main(int   argc,   char   *argv[])

{

printf( "sizeof(weekday_st)=%d\n ",   sizeof(weekday_st));

printf( "sizeof(weekday)=%d\n ",   sizeof(weekday_st::week));

printf( "sizeof(day)=%d\n ",   sizeof(weekday_st::day));

return   0;

}

sizeof(weekday_st)=1

sizeof(weekday)=4

sizeof(day)=4

printf( "sizeof(weekday_st)=%d\n ",   sizeof(weekday_st));

这里因为结构体里面并没有定义任何的变量

所以这个结构是空的,但是用sizeof进行运算的话也不能返回0

因为毕竟存在着这么一个东西

所以这时sizeof返回一个在机器里面所能表达的最小的存储单位的值

一般的PC里面最小的存储单位的值是char

所以sizeof返回1

printf( "sizeof(weekday)=%d\n ",   sizeof(weekday_st::week));

printf( "sizeof(day)=%d\n ",   sizeof(weekday_st::day));

因为枚举量是当作整型常量来处理的

所以上面这两个sizeof都是返回4

这里的enum   week和enum   day只是内嵌“类型”,而不是成员变量,如果改成:

typedef   struct   weekday_st

{

enum   week  {sun=123456789,mon,tue,wed,thu,fri,sat }   ew;

enum    day   {monring,   moon,   aftermoon}   ed;

}weekday_st;

sizeof(weekday_st)=8

sizeof(weekday)=4

sizeof(day)=4

c语言枚举法礼泡声次数,C语言枚举类型举例相关推荐

  1. c语言冒泡排序法程序填空_【C语言】两种方式实现冒泡排序算法

    题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行 ...

  2. c语言 乘除法优先级,运算符运算符优先级 - C语言教程

    运算符优先级 运算符的优先级确定表达式中项的组合.这会影响到一个表达式如何计算.某些运算符比其他运算符有更高的优先级,例如,乘除运算符具有比加减运算符更高的优先级. 例如 x = 7 + 3 * 2, ...

  3. c语言筛选法_「干货」C语言经典算法筛选法求质数,极少数人用过的素数求解法...

    小编是一个有着6年工作经验的工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习资料和工具,能够进我的群10048,-83029收取,免费送给大家,希望你也能凭着自己的努力, ...

  4. c语言 老式手机键盘的按键次数,C语言编程题目(1)字符串格式化操作 手机键盘次数统计-Go语言中文社区...

    题目如下: 本来遇到一些问题,还好都解决了.这里记录一下: 0x01 回顾gets.fgets.scanf函数的使用和区别 1 #include 2 #include 3 4 int main(voi ...

  5. C语言冒泡法输出成绩与学号,C语言:根据成绩进行冒泡排序,学号也得跟着动,输出的结果...

    满意答案 mzuhvg 2013.12.31 采纳率:58%    等级:11 已帮助:10668人 #include void bubble_sort(int a[][5]); void print ...

  6. c语言枚举法课程设计报告,枚举法的程序实现及优化

    计新明 内容分析 本部分内容是教育科学出版社出版的必修1<数据与计算>第四单元第一节中的内容,整本书的思路是初始数据与计算.编程计算.认识数据.计算与问题解决.数据分析与人工智能,第四章属 ...

  7. java穷举法解方程_枚举法(穷举法)_Java语言程

    枚举法(穷举法)_Java语言程 3.5.1 枚举法(穷举法) 枚举法就是把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. [例3-20] 百元买百鸡:用一百元钱买一百只鸡.已知公鸡5元/ ...

  8. c语言穷举算法 枚举法,c语言枚举法(穷举法).ppt

    c语言枚举法(穷举法) 枚举法(穷举法) "笨人之法": 把所有可能的情况一一测试,筛选出符合条件的各种结果进行输出. 百元买百鸡问题分析 百元买百鸡问题分析 优化 继续优化 利用 ...

  9. 2015年3月份ccf认证考试C语言(枚举法)

    试题编号: 201503-2 试题名称: 数字排序 时间限制: 1.0s 内存限制: 256.0MB 问题描述 给定n个整数,请统计出每个整数出现的次数,按出现次数从多到少的顺序输出. 输入格式 输入 ...

最新文章

  1. 重磅!腾讯发布AI生态计划将赋能1000合作伙伴!
  2. iOS Automated Tests with UIAutomation
  3. PHP的Session机制
  4. OS_CORE.C(4)
  5. Qt定时器QBasicTimer、startTimer、QTimer使用总结
  6. Spring Core Container 源码分析七:注册 Bean Definitions
  7. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
  8. 解析数论 2: Abel求和法
  9. PHP图片与文字合成
  10. Go Tools安装
  11. NetBIOS name
  12. 2022年「博客之星」参赛博主:(天寒雨落)在等您评价 ~{附实时总榜单排名}
  13. CMD里如何用DiskPart命令删除分区
  14. 问题(ArcGIS):去除栅格不需要的Value(背景值0)
  15. 在WRDS database上下载TAQ数据
  16. 为什么你得不到 90 度的温暖
  17. [宋史学习] 赵元僖
  18. 浙大愤青郑强教授的演讲(大学生都来看看吧)
  19. js按钮绑定点击事件
  20. stm32的flash和ram占用情况

热门文章

  1. Confluence 6 访问你的宏正文(body)
  2. 注解(一)- 基础知识与运行时注解
  3. js 当前日期增加自然月
  4. 转:upload.parseRequest为空
  5. hdu 1159(最长公共子序列)
  6. ubuntu安装配置方法【转】
  7. BZOJ1911 特别行动队
  8. Oracle+ASM单机环境下,开启归档的最简单的方法
  9. CentOS7下安装Redis — 单节点
  10. LintCode: Search A 2d Matrix