C语言进修教程第八章-列举、位运算(5)
二、位域的利用位域的利用和布局成员的利用沟通,其一般形式为: 位域变量名·位域名 位域答允用各类名目输出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
上例措施中界说了位域布局bs,三个位域为a,b,c。说明白bs范例的变量bit和指向bs范例的指针变量pbit。这暗示位域也是可以利用指针的。
措施的9、10、11三行别离给三个位域赋值。( 应留意赋值不能高出该位域的答允范畴)措施第12行以整型量名目输出三个域的内容。第13行把位域变量bit的地点送给指针变量pbit。第14行用指针方法给位域a从头赋值,赋为0。第15行利用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b华夏有值为7,与3作按位与运算的功效为3(111&011=011,十进制值为3)。同样,措施第16行中利用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其功效为15。措施第17行用指针方法输出了这三个域的值。
范例界说符typedef
C语言不只提供了富厚的数据范例,并且还答允由用户本身界说范例说明符,也就是说答允由用户为数据范例取“别名”。 范例界说符typedef即可用来完成此成果。譬喻,有整型量a,b,其说明如下: int aa,b; 个中int是整型变量的范例说明符。int的完整写法为integer,
为了增加措施的可读性,可把整型说明符用typedef界说为: typedef int INTEGER 这今后就可用INTEGER来取代int作整型变量的范例说明白。 譬喻: INTEGER a,b;它等效于: int a,b; 用typedef界说数组、指针、布局等范例将带来很大的利便,不只使措施书写简朴并且使意义更为明晰,因而加强了可读性。譬喻:
typedef char NAME[20]; 暗示NAME是字符数组范例,数组长度为20。
然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20]
又如:
typedef struct stu{ char name[20];
int age;
char sex;
} STU;
界说STU暗示stu的布局范例,然后可用STU来说明布局变量: STU body1,body2;
typedef界说的一般形式为: typedef 原范例名 新范例名 个华夏范例名中含有界说部门,新范例名一般用大写暗示, 以
便于区别。在有时也可用宏界说来取代typedef的成果,可是宏界说是由预处理惩罚完成的,而typedef则是在编译时完成的,后者更为机动利便。
本章小结
1. 列举是一种根基数据范例。列举变量的取值是有限的,列举元素是常量,不是变量。
2. 列举变量凡是由赋值语句赋值,而不由动态输入赋值。列举元素虽可由系统或用户界说一个顺序值,但列举元素和整数并不沟通,它们属于差异的范例。因此,也不能用printf语句来输出元素值(可输出顺序值)。
3. 位运算是C语言的一种非凡运算成果, 它是以二进制位为单元举办运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起构成复合赋值符。如&=,|=,^=,>>=,<<=等。
4. 操作位运算可以完成汇编语言的某些成果,如置位,位清零,移位等。还可举办数据的压缩存储和并行运算。
5. 位域在本质上也是布局范例,不外它的成员按二进制位分派内存。其界说、说明及利用的方法都与布局沟通。
6. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节减了存储空间,同时也提高了措施的效率。
7. 范例界说typedef 向用户提供了一种自界说范例说明符的手段,照顾了用户编程利用词汇的习惯,又增加了措施的可读性。