第11章 共用体、枚举和位运算

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C语言程序设计第11章共用体、枚举和位运算第11章共用体、枚举和位运算主要内容11.1共用体11.2枚举11.3位运算11.1共用体11.1.1共用体概述11.1.2共用体类型定义11.1.3共用体变量的定义11.1.4共用体变量的引用11.1.5共用体数据特点11.1.1共用体概述共用体是有别于以前任何一种数据类型的特殊数据类型,它是多个成员的一个组合体,但与结构体不同,共用体的成员被分配在同一段内存空间中,它们的开始地址相同,使得同一段内存由不同的变量共享。共同使用这段内存的变量既可以具有相同的数据类型,也可以具有不同的数据类型。2000H存储inti存储charch存储floatf11.1.2共用体类型定义共用体类型定义的一般形式union共用体名{数据类型成员名1;数据类型成员名2;……数据类型成员名n;};11.1.2共用体类型定义例如,以下用法定义了数据类型名为uniondata的共用体数据类型:uniondata{inti;charch;floatf;};在这里定义的uniondata共用体类型有3个成员:i、ch、f,它们的数据类型分别是int、char、float。11.1.3共用体变量的定义1.共用体类型与共用体变量同时定义uniondata{inti;charch;floatf;}u1,u2,u3;2.先定义共用体类型,再定义共用体变量uniondatau4,u5;3.直接定义共用体变量union{inti;charch;floatf;}u6,u7,u8;11.1.3共用体变量的定义共用体与结构体的区别:⑴结构体说明的是一个组合型的数据,多个不同的数据项可以作为一个数据整体对待;而共用体说明的是内存的一种共享机制,多个不同的变量可以使用同一段内存空间。⑵结构体中各成员有不同的地址,所占内存长度等于全部成员所占内存之和;而共用体各成员有相同的地址,所占内存长度等于最长的成员所占内存。11.1.4共用体变量的引用共用体是对多个变量共享同一段内存的定义,因此单独使用共用体变量时没有任何意义,只能通过引用共用体的成员来使用共用体变量。例如:使用u5.i形式引用共用变量u5的成员i;使用u5.ch形式引用共用变量u5的成员ch;使用u5.f形式引用共用变量u5的成员f。下面是在程序中使用共用体变量的语句:u1.i=20;scanf(%d,&u2.i);printf(%d\n,u1.i+u2.i);11.1.5共用体数据特点共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用,即:共用体变量中的值是最后一次存放的成员的值。例如,对以下赋值语句,当依次执行之后,只有第三个赋值语句起作用:u2.i=1;u2.ch='a';u2.f=1.5;若此时使用成员i或者ch的值则无任何意义。与结构体变量不同,共用体变量不能初始化,下面的用法是完全错误的。uniondata{inti;charch;floatf;}a={1,'a',1.5};共用体变量的地址和它的各成员的地址都是同一个地址值,如&u1、&u.i、&u.ch、&u.f是相同的。11.1.5共用体数据特点例11-1分析以下程序的执行结果。#includestdio.hunion{longi;intk;charm;chars[4];}part;main(){part.i=0x12345678;printf(part.i=%lx\n,part.i);printf(part.k=%x\n,part.k);printf(part.m=%x\n,part.m);printf(part.s[0]=%x\tpart.s[1]=%x\n,part.s[0],part.s[1]);printf(part.s[2]=%x\tpart.s[3]=%x\n,part.s[2],part.s[3]);}11.2枚举11.2.1枚举概述11.2.2枚举类型及枚举变量11.2.3枚举应用11.2.1枚举概述我们在编写程序时,经常遇到变量取值能够列举的情况,例如,表示星期的变量取值有星期一到星期天7个值,表示月份的变量取值有一月到十二月12个值,表示三原色的变量取值有红、黄、蓝3个值等。为了更好地处理这一类变量,ANSIC新标准增加了枚举数据类型,它把变量允许的取值明确列举了出来,使程序更直观,处理更有效。与结构体、共用体一样,枚举也不是一种固定结构的数据类型,它可以根据具体的情况,使用enum关键字进行定义,当定义了一种枚举类型以后,就可以使用已经定义的枚举数据类型定义枚举变量。11.2.2枚举类型及枚举变量1.枚举类型的定义定义形式enum枚举名{枚举值表};例如:enumweekday{Sun,Mon,Tue,Wed,Thu,Fir,Sat};2.枚举变量的定义与共用体变量的定义方式类似,枚举类型变量的定义方式也有三种:通过已定义的枚举类型名来定义枚举变量;在定义枚举类型的同时定义枚举变量;不使用枚举名,而直接定义枚举变量。例如:enumweekdayday1,day2;enumweekday{Sun,Mon,Tue,Wed,Thu,Fir,Sat}day1,day2;enum{Sun,Mon,Tue,Wed,Thu,Fir,Sat}day1,day2;11.2.2枚举类型及枚举变量3.枚举变量的值枚举变量只能从枚举类型列出的枚举元素中取值,一个枚举变量被定义之后,它的取值范围也就确定了。如上面的枚举变量day1、day2定义之后,它们的取值就被限定在它的7个枚举元素中,任何情况下它们的取值只能是其中的一个枚举元素。下面的两个赋值语句将使enumweekday型枚举变量day1和day2得到正确的取值。day1=Fir;day2=Wed;11.2.2枚举类型及枚举变量4.几点说明⑴枚举元素是常量,默认情况下元素的值是其在枚举值表中的顺序号。从第一个枚举元素开始,顺序号依次为0、1、2、...。例如,在weekday中,sun值为0,mon值为1,…,sat值为6。⑵枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。⑶在定义枚举类型时,可以指定枚举常量的值。例如:enumweekday{Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat};此时,Tue、Wed、...的值从Mon的值顺序加1,如,Tue=2。⑷整型与枚举类型是不同的数据类型,但仍然可以使用一个整数直接为枚举型变量赋值。例如:day1=2;day1=(enumweekday)11.2.3枚举应用例11-3有红、黄、蓝、白、黑五种颜色的球若干个,每次取出三个球,打印出三种不同颜色球的可能取法。分析:取彩球程序完全可以用数组实现予以实现。考虑到彩球的颜色取值只有五种,能够枚举,因此可以用枚举类型变量求解该问题。源程序11.3位运算11.3.1位运算概述11.3.2基本的位运算11.3.3位运算应用11.3.4位段11.3.1位运算概述位运算就是对数的二进制位进行的运算,可以对两个数进行按位运算,也可以对一个数进行按位运算,位运算主要用于系统程序或控制程序中。C语言中的位运算位运算名称位运算符按位与&按位或|按位异或^右移位左移位取反~11.3.2基本的位运算1.按位与运算按位与运算实现两个数据对应二进制位的与操作。二进制位与操作的规则如下:0&0=0,0&1=0,1&0=0,1&1=1从运算规则可见,只有进行与运算的两个二进制位都为1时,位运算结果为1,其余情况均为0。例如:对整数0x16和0x27进行按位与运算的结果是0x06,运算表达式是0x16&0x2711.3.2基本的位运算2.按位或运算按位或运算实现两个数据对应二进制位的或操作。二进制位或操作的规则如下:0|0=0,0|1=1,1|0=1,1|1=1从运算规则可见,只有进行或运算的两个二进制位都为0时,或运算结果为0,其余情况均为1。例如,对整数0x16和0x27进行按位或运算的结果是0x37,运算表达式是0x16|0x2711.3.2基本的位运算3.按位异或运算按位异或运算实现两个数据对应二进制位的异或操作。二进制位异或操作的规则如下:0^0=0,0^1=1,1^0=1,1^1=0从运算规则可见,只有进行异或运算的两个二进制位相同时(都为0或都为1),位运算结果为0,否则为1。即参加运算的两个运算量,如果两个相应位为“异”(值不同),则该位结果值为1,否则为0。例如,对整数0x16和0x27进行按位异或运算的结果是0x31,运算表达式是0x16^0x2711.3.2基本的位运算4.按位取反运算按位取反运算是单目运算,其功能是对参与运算的数的各二进位按位求反,将二进制位0变为1,将二进制位1变为0。例如,对整数0x16进行取反运算的结果是0XE9,运算表达式是~0x1611.3.2基本的位运算5.左移位运算左移位运算实现一个数据对应二进制数的向左移位,向左移位的位数由左移运算符右侧的数值决定。高位左移后溢出,不再起作用,低位补0。例如,下面的语句将使a左移4位:inta=0x16;a=a4;11.3.2基本的位运算6.右移位运算右移位运算实现一个数据对应二进制数的向右移位,向右移位的位数由右移运算右侧的数值决定。对于无符号数,右移后高位补0;对于有符号数,正数右移位后高位补0,而负数右移后高位补1。例如,下面的语句将使a右移4位:inta=0x167;a=a4;11.3.3位运算应用例11-5对于整数a,将它对应的二进制数的第4~7位(最右边一位为第0位)取出。基本算法⑴a4,使要取的数位右移到最右端。⑵设置一个低4位全为1、其余各位全为0的数b=0x000F与a作按位与运算,即得到a的规定数位。11.3.3位运算应用程序:#includestdio.hmain(){unsigneda,b,c;b=0x000F;scanf(%X,&a);c=a4;c=c&b;printf(%X\n,c);}本章小结1.共用体是一种特殊的数据类型,它是多个成员的一个组合体,其本质是使多个变量共享同一段内存,共用体变量中的值是最后一次存放的成员的值,共用体变量不能初始化,共用体变量的长度是成员中最大长度值。2.枚举是一种基本数据类型。枚举变量的取值是有限的,枚举元素是常量,不是变量,枚举变量通常由赋值语句赋值,枚举元素虽可由系统或用户定义一个顺序值,但枚举元素和整数并不相同,它们属于不同的类型。3.位运算是C语言的一种特殊运算功能,它是以二进制位为单位进行运算的,基本的位运算有按位与、按位或、按位异或、取反、左移位、右移位等六种。

1 / 28
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功