




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、枚举、联合、位域枚举、联合、位域Lesson 10Lesson 10程序设计基础主要内容主要内容联合联合1枚举枚举2位域位域 32程序设计基础 设有若干个人员的数据,其中有学生和教师。学设有若干个人员的数据,其中有学生和教师。学生的数据中包括:姓名、号码、性别、职业、生的数据中包括:姓名、号码、性别、职业、班级班级。教师的数据包括:姓名、号码、性别、职业、教师的数据包括:姓名、号码、性别、职业、职务职务。可以看出,学生和教师所包含的数据是不同的。现要可以看出,学生和教师所包含的数据是不同的。现要求把它们放在同一表格中求把它们放在同一表格中。联合体联合体 3程序设计基础&构造数据类型构造数据类型
2、,也叫共用体也叫共用体&用途:使几个不同类型的变量共占一段内存用途:使几个不同类型的变量共占一段内存(相互覆盖相互覆盖)共用体类型定义共用体类型定义定义形式:定义形式:union 共用体名 类型标识符 成员名; 类型标识符 成员名; .;例 union data int i; char ch; float f; ;fchi类型定义不分配内存联合体联合体 程序设计基础形式二: union data int i; char ch; float f; a,b;形式一: union data int i; char ch; float f; ; union data a,b,c,d3;形式三: uni
3、on int i; char ch; float f; a,b,c;fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在联合体联合体 程序设计基础引用方式:例 a.i=1; a.ch=a; a.f=1.5; printf(“%d”,a.i); ( 编译通过,运行结果不对) 引用规则不能引用共用体变量,只能引用其成员共用体变量名共用体变量名. .成员名成员名union data int i; char ch; float f; ;union data a,b,c,d3;a.i a.ch a.fd0.i d0.ch d0.f共用体变量中起作用的成员
4、是最后一次存放的成员例 union int i; char ch; float f; a; a=1; ( ) 不能全部初始化,只能初始化一个成员例 union int i; char ch; float f; a=1,a,1.5; ( ) 可以用一个共用体变量为另一个变量赋值例 float x; union int i; char ch; float f; a,b; a.i=1; a.ch=a; a.f=1.5; b=a; ( ) x=a.f; ( )例 union int i; char ch; float f; a=1; ( ) 联合体联合体 程序设计基础结构体与联合体区别: 存储方式不同
5、struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在联系: 两者可相互嵌套联合体联合体 程序设计基础例 结构体中嵌套联合体 struct int num; char name10; char sex; char job; union int class; char position10; category;person2;例 联合体中嵌套结构体struct w_tag char low; char high;union u_tag struct w_tag byte_
6、acc; int word_acc;u_acc;联合体联合体程序设计基础主要内容主要内容联合联合1枚举枚举2位域位域 39程序设计基础枚举:枚举:将变量的值一一列举出来,变量的值只限于列举将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。出来的值的范围内。申明枚举类型用申明枚举类型用enumenumenum weekdaysunenum weekdaysun,monmon,tuetue,wedwed,thuthu,frifri,sat;sat; 定义变量:定义变量:enum weekday workday;enum weekday workday;workdayworkday变量值只
7、能是变量值只能是sunsun到到satsat之一之一 枚举类型枚举类型10程序设计基础 枚举类型的变量定义枚举类型的变量定义enum weekdaysun,mou,tue,wed,thu,fri,sat ;enum weekday a,b,c;或者为:或者为:enum weekday sun,mou,tue,wed,thu,fri,sat a,b,c;或者为:或者为:enum sun,mou,tue,wed,thu,fri,sata,b,c;11程序设计基础 枚举类型的使用枚举类型的使用在编译中,对枚举元素按常量处理,故在编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们称枚
8、举常量。它们不是变量,不能对它们赋值。赋值。 枚举元素作为常量,它们是有值的,语枚举元素作为常量,它们是有值的,语言编译按定义时的顺序使它们的值为,言编译按定义时的顺序使它们的值为, 12程序设计基础 枚举类型的使用示例枚举类型的使用示例13 enum weekday sun,mon,tue,wed,thu,fri,sat a,b,c; main() a=sun; b=mon; c=tue; printf(%d,%d,%d,a,b,c);程序设计基础主要内容主要内容联合联合1枚举枚举2位域位域 314程序设计基础位运算符和位运算位运算符和位运算运算符运算符 含义含义 运算符运算符 含义含义 按
9、位与按位与 取反取反 | | 按位或按位或 右移右移(1)(1)位运算符中除以外,均为二目(元)运算符,位运算符中除以外,均为二目(元)运算符,即要求两侧各有一个运算量。即要求两侧各有一个运算量。(2)(2)运算量只能是整型或字符型的数据,不能为实型运算量只能是整型或字符型的数据,不能为实型数据。数据。语言提供的位运算符有:语言提供的位运算符有: 15程序设计基础 “按位与按位与”运算符()运算符()按位与是指:按位与是指:参加运算的两个数据,按二进制位进行参加运算的两个数据,按二进制位进行“与与”运算。如果两个相应的二进制位都为,则运算。如果两个相应的二进制位都为,则该位的结果值为;否则为。
10、即:该位的结果值为;否则为。即:,例:例:注意:注意:如果参加&运算的是负数(如-3&-5),则要以补码形式表示为二进制数,然后再按位进行“与”运算。 00000011(3)& & 00000101(5) 00000001(1) 3&5的值得16程序设计基础“按位与按位与”运算符()运算符() 若想对一个存储单元清零,即使其全部二进制位若想对一个存储单元清零,即使其全部二进制位为,只要找一个二进制数,其中各个位符合以下为,只要找一个二进制数,其中各个位符合以下条件:条件:原来的数中为的位,新数中相应位为。原来的数中为的位,新数中相应位为。然后使二者进行运算,即可达到清零目的。然后使二者进行运算
11、,即可达到清零目的。应用(应用(1):清零):清零 17应用应用(2 2):取一个数中某些指定位):取一个数中某些指定位 如有一个整数(个字节),想要取其中的低如有一个整数(个字节),想要取其中的低字节,只需将与字节,只需将与8 8个个1 1按位与即可。按位与即可。 应用应用(3 3):保留一位的方法:与一个数进行运):保留一位的方法:与一个数进行运算,此数在该位取。算,此数在该位取。程序设计基础 “ “按位或按位或”运算符(运算符(| |)两个相应的二进制位中只要有一个为,该位的结两个相应的二进制位中只要有一个为,该位的结果值为。果值为。即即 | |,| |,| |,| |例:例: 060|
12、017,060|017,将八进制数将八进制数6060与八进制数与八进制数1717进行进行按位或运算。按位或运算。 00110000| 00001111 00111111 18程序设计基础应用:按位或运算常用来对一个数据的某些位定应用:按位或运算常用来对一个数据的某些位定值为。值为。例如:如果想使一个数的低位改为,只需例如:如果想使一个数的低位改为,只需将与进行按位或运算即可。将与进行按位或运算即可。19 “ “按位或按位或”运算符(运算符(| |)程序设计基础“异或异或”运算符(运算符()异或运算符异或运算符也称也称XORXOR运算符。它的规则是:运算符。它的规则是:若参加运算的两个二进制位同
13、号则结果为(假)若参加运算的两个二进制位同号则结果为(假) 异号则结果为(真)异号则结果为(真)即:00=0,01=1,10=1, 11=0即即: 071052=023 : 071052=023 (八进制数)(八进制数) 00111001 00101010 00010011 例:例:20程序设计基础应用(应用(1 1):使特定位翻转):使特定位翻转 设有,想使其低位翻转,即设有,想使其低位翻转,即变为,变为。可以将它与变为,变为。可以将它与进行进行运算。运算。21“异或异或”运算符(运算符()应用(应用(2 2):):交换两个值,不用临时变量例如:,。例如:,。想将和的值互换,可以用以下赋值语
14、句实现:想将和的值互换,可以用以下赋值语句实现:ab;ab;ba;ba;ab;ab; () (ab的结果,a已变成)() (ba的结果,b已变成)() (ab的结果,a已变成)程序设计基础 “ “取反取反”运算符()运算符() 是一个单目(元)运算符,用来对一个二是一个单目(元)运算符,用来对一个二进制数按位取反,即将变,将变。例如进制数按位取反,即将变,将变。例如,是对八进制数(即二进制数,是对八进制数(即二进制数)按位求反。)按位求反。 0000000000010101() 1111111111101010 (八进制数八进制数177752)177752)22程序设计基础左移运算符()左移运
15、算符() 左移运算符是用来将一个数的各二进制左移运算符是用来将一个数的各二进制位全部左移若干位。位全部左移若干位。 例如:例如:a=a2 a=a) 右移运算符是右移运算符是a2a2表示将表示将a a的各二进制的各二进制位右移位右移2 2位,移到右端的低位被舍弃位,移到右端的低位被舍弃, ,对无符对无符号数号数, ,高位补高位补0 0。例如:例如:a=015a=015时,时,a a的值用二进制形式表示为的值用二进制形式表示为0000111100001111,舍弃低,舍弃低2 2位位1111:a2=00000011a2=00000011右移一位相当于除以右移一位相当于除以2 2 右移右移n n位相
16、当于除以位相当于除以2n2n。 24程序设计基础在右移时在右移时, ,需要注意符号位问题:需要注意符号位问题: 对无符号数对无符号数, ,右移时左边高位移入右移时左边高位移入0 0;对;对于有符号的值于有符号的值, ,如果原来符号位为如果原来符号位为0(0(该数为正该数为正),),则右边也是移入则右边也是移入0 0。如果符号位原来为。如果符号位原来为1(1(即负即负数数),),则右边移入则右边移入0 0还是还是1,1,要取决于所用的计算要取决于所用的计算机系统。有的系统移入机系统。有的系统移入0,0,有的系统移入有的系统移入1 1。移。移入入0 0的称为的称为“逻辑右移逻辑右移”, ,即简单右
17、移;移入即简单右移;移入1 1的称为的称为“算术右移算术右移”。 右移运算符(右移运算符()25程序设计基础例:例:a a的值是八进制数的值是八进制数113755113755: a: 1001011111101101 a: 1001011111101101 (用二进制形式表示(用二进制形式表示)a1: 0100101111110110 (a1: 0100101111110110 (逻辑右移时逻辑右移时) )a1: 1100101111110110 (a1: 1100101111110110 (算术右移时算术右移时) ) 在有些系统中在有些系统中,a1,a1得八进制数得八进制数045766,04
18、5766,而在而在另一些系统上可能得到的是另一些系统上可能得到的是145766145766。Turbo CTurbo C和其和其他一些他一些C C编译采用的是算术右移编译采用的是算术右移, ,即对有符号数右即对有符号数右移时移时, ,如果符号位原来为如果符号位原来为1 1,左面移入高位的是,左面移入高位的是1 1。右移运算符(右移运算符()26程序设计基础位运算赋值运算符位运算赋值运算符 位运算符与赋值运算符可以组成复合赋值运算符。位运算符与赋值运算符可以组成复合赋值运算符。 例如例如: &=, |=, =, =, =, =例: a & = b相当于 a = a & b a =2相当于a =
19、a 2赋值运算符赋值运算符27程序设计基础不同长度的数据进行位运算不同长度的数据进行位运算 如果两个数据长度不同,进行位运算时如果两个数据长度不同,进行位运算时( (如如a & b,a & b,而而a a为为longlong型型,b,b为为intint型型),),系统会将系统会将二者按右端对齐。如果二者按右端对齐。如果b b为正数为正数, ,则左侧则左侧1616位位补满补满0 0;若;若b b为负数为负数, ,左端应补满左端应补满1 1;如果;如果b b为无为无符号整数型符号整数型, ,则左侧添满则左侧添满0 0。28程序设计基础位段位段( (位域位域) ) 信息的存取一般以字节为单位。实际上
20、,有时信息的存取一般以字节为单位。实际上,有时存储一个信息不必用一个或多个字节,例如,存储一个信息不必用一个或多个字节,例如,“真真”或或“假假”用或表示,只需位即可。在计算机用或表示,只需位即可。在计算机用于过程控制、参数检测或数据通信领域时,控制用于过程控制、参数检测或数据通信领域时,控制信息往往只占一个字节中的一个或几个二进制位,信息往往只占一个字节中的一个或几个二进制位,常常在一个字节中放几个信息。常常在一个字节中放几个信息。29怎样向一个字节中的一个或几个二进制位怎样向一个字节中的一个或几个二进制位赋值和改变它的值呢?赋值和改变它的值呢?程序设计基础C C 语言允许在一个结构体中以位
21、为单位来指定语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员其成员所占内存长度,这种以位为单位的成员称为称为“位段位段”或称或称“位域位域” ( bit field) ( bit field) 。利用位段能够用较少的位数存储数据。利用位段能够用较少的位数存储数据。 位段位段( (位域位域) )30程序如下:struct packed-data unsigned :; unsigned:; unsigned:; unsigned:; int ; data; 程序设计基础位段位段( (位域位域) )结构类型中,可含有若干个(甚至全部)位域,结构类型中,可含有若干个(甚至全部)位域,位域的定义形式为:位域的定义形式为: 类型名类型名 位域名位域名: 域长域长; 示例: 定义存储工作人员信息的结构含有普通域:姓名(name)、年龄(age)、 住址(addr结构类型)、应支付的工资(pay)位域(只占一位):该员是否已退休( state )、 工资是否已发放(payoff)普通
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025-2030中国异戊橡胶产业需求态势及投资效益预测报告
- 企业招聘经验分享:中航面试题精 编求职经验大公开
- 智能领域面试实战经验分享:面试技巧、面试题目及答案详解
- 三八妇女权益保护课件
- 大班美术公开课教案及教学反思《七彩蛇》
- 小儿艾灸课件教学
- 小儿臀红的护理
- 大学生知识竞赛策划书
- 大学生护理实习心得
- 大学毕业生社会实践报告
- 2025年(完整版)十八项核心制度培训考核试题(含答案)
- 社工的劳动合同范本(2025版)
- 纺织服装产业园项目建设方案
- DB44T 1597-2015 电镀水污染物排放标准
- 儿童保健工作管理办法
- 全固态高功率超快激光器:放大机制与热透镜效应的深度剖析
- KET教学课件新版
- DGTJ08-2232-2017 城市轨道交通工程技术规范
- 中职思政试题及答案
- 中小学暑期安全教育班会课件
- 统计过程控制
评论
0/150
提交评论