c语言程序设计3第9章其他数据类型

上传人:san****019 文档编号:69811608 上传时间:2019-01-15 格式:PPT 页数:39 大小:203.50KB
返回 下载 相关 举报
c语言程序设计3第9章其他数据类型_第1页
第1页 / 共39页
c语言程序设计3第9章其他数据类型_第2页
第2页 / 共39页
c语言程序设计3第9章其他数据类型_第3页
第3页 / 共39页
c语言程序设计3第9章其他数据类型_第4页
第4页 / 共39页
c语言程序设计3第9章其他数据类型_第5页
第5页 / 共39页
点击查看更多>>
资源描述

《c语言程序设计3第9章其他数据类型》由会员分享,可在线阅读,更多相关《c语言程序设计3第9章其他数据类型(39页珍藏版)》请在金锄头文库上搜索。

1、第9章 其他数据类型,9.1 枚 举 9.2 位 段 9.3 用typedef定义类型别名,9.1 枚 举,枚举是一个有名字的整型常量的集合,该类型的变量只能取集合中列举出来的所有合法值。 9.1.1 枚举类型和枚举变量的定义 1定义枚举类型 定义一个枚举数据类型通常采用如下形式: enum 类型名 枚举符表 ; enum color red,green,blue,yellow,white ;,2定义枚举变量 enum 类型名 变量名1,变量名2,; enum color select,change,*cp; 对枚举变量的定义还可采用缺省类型名的形式。 enum pen,pencil,book

2、,notebook learning; 也可定义一个枚举类型的数组,例如: enum month January,February,March,April,May,June,July, Augest,September,October,November,December ; enum month months12;,3枚举变量的取值 枚举变量的取值范围限定在对应的枚举符表中的元素。例如,select和change只能被赋值为color中的五种颜色名的某一种: selectred; changeyellow;,C编译对枚举元素实际上是作为整常量处理的,所以枚举元素又称为枚举常量。当遇到枚举符表时

3、,编译程序就把其中第一个元素赋值为0,以后依次把1,2,3赋值给第二个元素、第三个元素、第四个元素。 selectred 中,select被赋值0,并非将字符串“red”赋给select。 应注意,枚举元素不是变量,不能对它们赋值,也不能用“&”运算符取其地址。, 可以把某个枚举元素规定为指定的整常数。 enum color red,green,blue5,yellow,white; 编译程序对blue之前的枚举元素照常从0开始、递增赋予整常数,并对blue赋予指定值5,而blue之后的各枚举元素则在此基础上递增赋值。 当变量取值范围限制在规定的整常数范围内的情况下,就可采用枚举类型。枚举变量

4、的作用域与一般变量的作用域相同。,例9-2:这是一个儿童游戏程序。孩子们用不同的手势表示三种不同的对象,如伸开手掌象征“布”(cloth,用字符c表示),握成拳头象征“锤子”(hammer,用字符h表示),只伸出食指和中指象征“剪刀”(scissors,用字符s表示)。其胜负规则是“布包锤子,锤子砸剪刀,剪刀剪布”。如手势相同则不分胜负。,#include #include enum games cloth,hammer,scissors,game,quit; enum games select(); enum games mach(); int won(enum games player,e

5、num games machine); void result(int win,int lose,int tie);,void main() enum games player,machine; int win,lose,tie; winlosetie0; printf(“nsnsnsnsns“,“c is for cloth“, “h is for hammer“,“s is for scissors“, “g is for result“,“another character is for quit“);,while(playerselect()!quit) switch(player)

6、case cloth: case hammer: case scissors: machinemach(); if(playermachine) tie; printf(“na tie“); ,else if(won(player,machine) win; printf(“nyou won“); else lose; printf(“nI won“); break; case game: result(win,lose,tie); break; ,result(win,lose,tie); printf(“nBYE!n“); enum games select() char c; enum

7、games player; printf(“nInput a character:“); while(cgetchar() |cn|ct);,switch(c) case c:playercloth; break; case h:playerhammer; break; case s:playerscissors; break; case g:playergame; break; default:playerquit; break; return(player); ,enum games mach() static int i0; irand()3; return(i0)?cloth:(i1)

8、?hammer:scissors); ,int won(enum games player,enum games machine) int victory; if(playercloth) victorymachinehammer; else if(playerhammer) victorymachinescissors; else victorymachinecloth; return(victory); ,void result(int win,int lose,int tie) printf(“nGAME STATUS“); printf(“n7dsn7dsn7dsn7ds“,win,“

9、games won by you“, lose,“games won by me“,tie,“games tied“, winlosetie,“games played“); ,9.2 位 段,9.2.1 字位标志法 有些对象的特征不必用一个字节或多个字节来表示,只用一个或几个二进制位即可。 #define ERROR 0100000 (八进制,下同) #define CTLRDY 0200 #define IENABLE 0100 #define READ 04 #define WRITE 02 #define RESET 01,利用第3章介绍过的位运算符(如、&、|、等)可置上或清除相应的

10、标志,进而判断磁盘机当前的工作状态。 flags | CTLRDY | IENABLE;,9.2.2 位段的定义及其引用 位段是结构或联合中的成员,它们所占存储空间的大小是以二进制位为单位(故称位段)、并且在定义时所占位数被明确指定。例如: struct status unsigned err:2; unsigned ready:1; unsigned ienable:1; int flag:4; ;,位段结构类型的一般定义形式是: struct 结构名 类型 位段名1:位数1; 类型 位段名2:位数2; ; “结构名”是标志结构类型的名称;位段名是位段的名称,即标识结构成员的标识符;在位段名

11、后面有一个冒号“:”,冒号后面是表示该位段所占位数的数字。,对位段的引用方式类似于对结构成员的引用方式。 struct ex int x:5; unsigned k:7; unsigned m:6; tag,* p; p &tag; tag .x 10; 表示将10赋予位段x。 tag . m tag . k; 表示将位段k的值赋予位段m。 p-k 7; 表示将数值7赋予p所指向结构变量(即tag)中的位段k。 在执行赋值语句时应注意位段所允许的最大值的范围。,各位段的类型可以是int、unsigned int或者signed int。 位段可以存放在任何可寻址的存储单元中,要求这个存储单元足

12、以容纳这个位段。如果在一个存储单元中已存放了某个位段,还剩余一部分空间,并且剩余的空间能够容纳该结构中下面紧随的一个位段,那么后者也放入该存储单元中,它们的二进制位是邻接的。好象是把这些位段“打包”,一起放入某个存储单元。如果剩余的空间不足以容纳后随的位段,那么就有两种可能的处理方式:使剩余的那部分空间空闲着,把后随的位段放入下一个存储单元中;或者紧接着存放后随的位段,超出的部分就放入邻接的存储单元中。,例9-3:下面的程序显示含有位段的结构变量所占用的字节数量,以及结构变量在内存中的地址分配情况。 #include void main() struct unsigned i:2; unsig

13、ned j:3; unsigned k:2; unsigned l:4; int q:13; a;,struct int m:5; int n; int o:2; b; printf(“d*dn“,sizeof(a),sizeof(b); printf(“lu#lun“,(unsigned long)&a,(unsigned long)&b); printf(“nd#dn“,sizeof(b),sizeof(b.n); printf(“lu*lun“,(unsigned long)&b,(unsigned long)&b.n); ,存在一种无名位段,它没有标识符,只有“:”和其后表示位数的整常

14、数。无名位段占据指定的二进制位,但不能被访问,主要用来填充空间,以满足某种数据类型的格式要求。 struct word unsigned is_keyword:1; unsigned :8; unsigned is_extern:1; unsigned :5; unsigned is_static:1; flags;,例9-4:显示无名位段和长度为0 的位段的性质。 #include void main() struct unsigned i1; unsigned5; unsigned j3; unsigned6; unsigned k1; a;,struct int x2; unsigned

15、 y1; unsigned0; unsigned z1; int w2; b;,struct int x2; unsigned y1; unsigned2; unsigned z1; int w2; c; printf(“d*d*dn“,sizeof(a),sizeof(b),sizeof(c); printf(“lu#lu#lun“,(unsigned long)&a, (unsigned long)&b,(unsigned long)&c); ,在我们的机器上,运行结果示例如下所示: 2*2*1 398000116#398000114#398000112,在定义和使用位段时,还应注意以下几点: 定义位段时,位段的长度不能大于整字的长度。 位段不能构成数组,不能对它使用&运算符,也就不能用指针变量指向位段。 可以在算术表达式中使用位段,系统会自动把它们转换成整型量。 在计算含有位段的结构占用存储空间的大小时,一般不能简单地把各成员的位数相加,要使用运算符sizeof,它给出运算分量所占空间的字节数。 sizeof(struct x),9.3 用typedef定义类型别名,在C语言

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号