C语言程序设计教程 第10章_第1页
C语言程序设计教程 第10章_第2页
C语言程序设计教程 第10章_第3页
C语言程序设计教程 第10章_第4页
C语言程序设计教程 第10章_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第10章 共用体与枚举类型2021/11/19C语言程序设计教程210.1 10.1 共用体类型与共用体类型与 共用体变量共用体变量 共用体是共用体是C的由用户定义的数据类型。共用体把的由用户定义的数据类型。共用体把不同类型的数据项组成一个整体,这些不同类型的不同类型的数据项组成一个整体,这些不同类型的数据项在内存中所占用的起始单元是相同的。数据项在内存中所占用的起始单元是相同的。1. 共用体类型的定义共用体类型的定义共用体类型定义用关键字union标识, 形式为: union 标识符 成员说明列表; 第10章 共用体与枚举类型2021/11/19C语言程序设计教程3 标识符给出共用体名, 是

2、共用体类型名的主体, 定义的共用体类型由“union 标识符”标识。例如,定义一个共用体类型, 要求包含一个整型成员,一个字符型成员和一个单精度型成员: union icfint i; char c; float f; ; 第10章 共用体与枚举类型2021/11/19C语言程序设计教程42 共用体变量的定义共用体变量的定义 (1) 先定义共用体类型, 再定义共用体变量: union 共用体名 成员表; union 共用体名 变量表; 例如:例如:union data int i; char ch; float f;union data a,b,c;第10章 共用体与枚举类型2021/11/1

3、9C语言程序设计教程5(2) 定义共用体类型的同时定义共用体变量union 共用体名共用体名 成员表成员表 变量表;变量表;例如:union data int i; char ch; float f;a,b,c; 第10章 共用体与枚举类型2021/11/19C语言程序设计教程6(3)定义共用体类型时,省略共用体类型名,同时定义共用体类型时,省略共用体类型名,同时定义共用体类型变量定义共用体类型变量union 成员表成员表 变量表;变量表;例如:union int i; char ch; float f;a,b,c; 第10章 共用体与枚举类型2021/11/19C语言程序设计教程710.2

4、10.2 共用体变量的引用共用体变量的引用 共用体变量不能直接使用,只能使用里面的某个成员,其成员同样通过点运算描述。形式为: 共用体变量名.成员名 例如,定义上面共用体类型变量a ,a占有4个字节的空间,a.i 表示其整型成员,a.ch表示其字符型成员,a.f表示其单精度型成员。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程8 说明: (1) 共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用。在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型。 (2) 共用体变量中起作用的成员值是最后一次存放的成员值,即共用体变量所有成员共用同

5、一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。如: a.i=278, a.ch=D, a.f=5.78;不能企图通过下面的printf函数得到a.i和a.ch的值: printf(“%d,%c,%f”, a.i, a.ch, a.f);但能得到a.f的值。第10章 共用体与枚举类型2021/11/19C语言程序设计教程9 (3) 共用体变量的地址和它的各个成员的地址相同。 (4) 不能企图引用共用体变量名来得到某成员的值。 (5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型。 (6) 共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至

6、还可以定义共用体数组。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程10例10.1 写出下列程序的执行结果main()union exx int a,b; structint c,d;lpp;e=10;e.b=e.a+20;e.lpp.c=e.a+e.b;e.lpp.d=e.a*e.b;printf(“%d,%dn”,e.lpp.c,e.lpp.d);程序运行结果如下:60,3600第10章 共用体与枚举类型2021/11/19C语言程序设计教程11 10.3 10.3 共用体变量的应用共用体变量的应用 例例 10 - 2 设有若干教师的数据,包含有教师编号、姓名、职称,若

7、职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程12程序如下:union cfchar clname30; /*所讲课程*/int num; /*论文数目*/; struct teachersint no; /*编号*/ char name12; /*姓名*/ char zc; /*职称*/ union cf x; /*可变字段, 为所讲课程或论文数目*/ teach3;第10章 共用体与枚举类型2021/11/19C语言程序设计教程13main( )int i; for(i=0; i3; i+) sca

8、nf(%d, %s, %c, &teachi.no, , &teachi.zc);); if (teachi.zc= =L)/*L表示讲师表示讲师*/ scanf(%s, &teachi.x .clname);); else if (teachi.zc= =P )/*P表示教授表示教授*/ scanf (%d, &teachi.x .num);); else printf (input data errorn);); for(i=0; i、。(1)&(按位“与”)运算规则为:0&0=0,0&1=0,1&0=0

9、,1&1=1例如,-5&3的值为3。其中-5的补码(为简便起见,用8位二进制表示)为1111 1011,3的补码为0000 0011,按位与的结果为0000 0011,即值为十进制数3。第10章 共用体与枚举类型2021/11/19C语言程序设计教程16(2)|(按位“或”)运算规则为:0|0=0,0|1=1,1|0=1,1|1=1例如,-5|3的值为-5。-5与3相位或后得11111011,其真值为-0000101,即-5。(3)(按位“异或”)运算规则为:00=0,01=1,10=1,11=0例如,-53的值为-8。(4)(按位“取反”)运算规则为:0=1,1=0例如,7的

10、值为-8。第10章 共用体与枚举类型2021/11/19C语言程序设计教程17(5)(“左移”)例如,3(“右移”)移动对象为正数时,高位补0。为负数时,逻辑右移,高位补0;算术右移,高位补1。Turbo C采用的是算术右移,有的C语言版本则采用逻辑右移。例如,-32,将3右移2位,左边(最高位)补1,结果为-1。第10章 共用体与枚举类型2021/11/19C语言程序设计教程1810.4.2 位段结构 位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。采用位段结构既节省存储空间,又可方便操作。位段结构中位段的定义格式为: unsigned unsigned

11、: 例如:struct bytedataunsigned a:2; /*位段a,占2位*/ unsigned:6; /*无名位段,占6位,但不能访问*/ unsigned:0; /*无名位段,占0位,表下一位段从下一字边界开始*/ unsigned b:10; /*位段b,占10位*/ int i; /*成员i,从下一字边界开始*/data;第10章 共用体与枚举类型2021/11/19C语言程序设计教程19位段数据的引用,同结构体成员中的数据引用一样,但应注意位段的位段数据的引用,同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数确定的范围,否则超出部分会丢弃。最大取

12、值范围不要超出二进制位数确定的范围,否则超出部分会丢弃。例如:例如:data.a=2; 但但 data.a=10;就超出范围(就超出范围(a占占2位,最大位,最大3)关于位段数据,注意以下几点:关于位段数据,注意以下几点:(1)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。位段。(2)可以通过定义长度为)可以通过定义长度为0的位段的方式使下一位段从下一存储单元的位段的方式使下一位段从下一存储单元开始。开

13、始。(3)可以定义无名位段。)可以定义无名位段。(4)位段的长度不能大于存储单元的长度。)位段的长度不能大于存储单元的长度。(5)位段无地址,不能对位段进行取地址运算。)位段无地址,不能对位段进行取地址运算。(6)位段可以以)位段可以以%d,%o,%x格式输出。格式输出。(7)位段若出现在表达式中,将被系统自动转换成整数。)位段若出现在表达式中,将被系统自动转换成整数。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程20 例例10.3 10.3 编程将一个编程将一个1616进制整数(占进制整数(占2 2字节)的各位循环左字节)的各位循环左移移4 4个二进制位,如个二进制位,如

14、2fe12fe1循环左移循环左移4 4个二进制位后为个二进制位后为fe12fe12。分析:可先取出16进制整数的最高4个二进制位,然后将该整数左移4个二进制位,最后将先前取出的最高4个二进制位放入低4个二进制位位置。具体步骤为:具体步骤为:(1)取出)取出16进制整数进制整数x的最高的最高4个二进制位至个二进制位至y:y=x(16-4)&0 xf。( 2 ) 将 该 整 数) 将 该 整 数 x ( 占( 占 2 字 节 ) 左 移字 节 ) 左 移 4 个 二 进 制 位 :个 二 进 制 位 :x=(x(16-4)&0 xf; x=(x4)&0 xffff; /*1

15、6位的位的C语言程序不需要语言程序不需要“按位按位与与”0 xffff*/ x=x|y; printf(“循环左移循环左移4个二进制位得:个二进制位得:%x”,x);程序运行结果如下:请输入16进制整数:2fe1循环左移4个二进制位得:fe12第10章 共用体与枚举类型2021/11/19C语言程序设计教程2210.5 10.5 枚举类型枚举类型 1. 枚举类型的定义枚举类型的定义 枚举类型定义用关键字enum标识,形式为: enum 标识符 枚举数据表; 标识符用来区分不同的枚举类型,定义的枚举类型用enum标识符”标识。 枚举数据(枚举常量)是一些特定的标识符, 标识符代表什么含义,完全由

16、程序员决定。数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程23 例如: (1) 定义枚举类型status, 包含复制与删除两种状态: enum statuscopy, delete; 枚举类型status仅有两个数据,一个是copy,一个是delete, 序号为0、 1, 代表复制与删除。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程24 (2) 定义枚举类型color,包含红、黄、蓝、白、黑五种颜色: enum color red, yellow, blue, white, black; 枚举类型

17、color有red、 yellow、 blue、 white、 black五个数据, 序号为0、 1、 2、 3、 4, 代表红、 黄、 蓝、 白、 黑五种颜色。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程25 (3) 定义枚举类型weekday, 包含一周的七天: enum weekday sun, mon, tue, wed, thu, fri, sat; 枚举类型weekday有sun、 mon、 tue、 wed、 thu、 fri、sat七个数据, 序号为0、 1、 2、 3、4、 5、 6, 代表一周中的星期天、星期一、星期二、星期三、星期四、 星期五、星期六

18、。 在定义枚举类型时,程序员可在枚举数据时通过“=”号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增。例如: enum status copy=6, delete; 则copy的序号为6, delete的序号为7。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程262. 枚举类型变量的定义枚举类型变量的定义 (1) 先定义枚举类型, 再定义枚举类型变量: enum 标识符 枚举数据表; enum 标识符 变量表; (2) 在定义枚举类型的同时定义枚举类型变量: enum 标识符 枚举数据表 变量表; (3) 直接定义枚举类型变量: enum 枚举数据表 变量表;

19、第10章 共用体与枚举类型2021/11/19C语言程序设计教程27 例如, 对枚举类型enum color, 定义枚举变量c1、 c2: enum color red, yellow, blue, white, black; enum color c1, c2; 或enum color red,yellow,blue,white,black c1, c2; 或enum red, yellow, blue, white, black c1, c2; 枚举类型数据可以进行赋值运算。枚举类型是有序类型, 枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较, 只有同一种枚举类型的

20、数据才能进行比较。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程28 将枚举型数据按整型格式输出,可得到整数值(枚举变量值的序号)。 使用强制类型转换,可将整数值(枚举值序号)转换成对应枚举值。 例如: c1=(enum color )2; /*c1得到枚举值blue*/ 枚举类型数据不能直接输入输出。枚举类型数据输入时,先输入其序号,再进行强制类型转换完成。输出时,采用开关语句先进行判断,再转化成对应字符串输出。 第10章 共用体与枚举类型2021/11/19C语言程序设计教程29 例例 10.410.4 某口袋中有红、 黄、 蓝、 白、 黑五种颜色的球若干个,每次从口袋

21、中取出三个球,问得到三种不同颜色的球有多少种取法,并输出每种组合结果。 for (n=0, i=1; i=5; i+) /*取第一个球取第一个球*/ for (j=1; j=5; j+) /*取第二个球取第二个球*/ if (i!=j) /*第一个与第二个不同色第一个与第二个不同色*/ for(k=1; k=5; k+)/*取第三个球取第三个球*/ if(k!=i) & (k!=j) n+; /*统计有多少种取法统计有多少种取法*/ printf (%d, %d, %dn, i, j, k);); /*输出一种取法输出一种取法*/ 不用枚举类型: 第10章 共用体与枚举类型2021/1

22、1/19C语言程序设计教程30 采用枚举类型来描述数据。设用red表示红色球,yellow表示黄色球,blue表示蓝色球,white 表示白色球, black表示黑色球。 main( )enum color red, yellow, blue, white, black; enum color i, j, k, l; int n, m; for(n=0, i=red; i=black; i+) for(j=red; j=black; ; j+) if(i!=j) for(k=red; k=black; k+) 第10章 共用体与枚举类型2021/11/19C语言程序设计教程31 if(k!=i

23、)&(k!KG-*4=j) n+; printf(%4d, n);); for(m=1; m=3; m+) switch(m) case 1: 1=i; berak; case 2: 1=j; berak; case 3: 1=k; berak; switch(l)/*间接输出间接输出*/ case red: printf(%8s, red),), break; 第10章 共用体与枚举类型2021/11/19C语言程序设计教程32 case yellow: printf(%8s, yellow);); break; case blue: printf(%8s),), blue);); break; case white: printf(%8s, white);); break;; case black: printf(%8s, black);); break; printf(n);); printf(总的取法有总的取法有%d种种n, n);); 第10章 共用体与枚举类型2021/11/19C语言程序设计教程3310.6 10.6 类型定义类型定义 在使用标准类型定义或说明变量时,可只写标准类型名指明变量数据类型。而用前面介绍的结构体、共用体、枚举等类型定义或说明变量时要冠以表明数据类型类别

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论