《自考计算机基础与程序设计.ppt》由会员分享,可在线阅读,更多相关《自考计算机基础与程序设计.ppt(23页珍藏版)》请在三一办公上搜索。
1、,位运算与预处理,共 26 页 第 2 页,第九章 位运算与预处理,第一节 位运算第二节 宏定义第三节 文件包含第四节 预编译,运算符,()括号 改变表达式中的优先级关系单目运算符+;-;!;-(负),*(指针),%=逗号运算符,高,低,位运算符,2)算术表达式的格式:是单目运算符:a 其余都是双目运算符:a&b,a|b,a23)操作步骤 1)将运算分量转化为二进制(默认8位二进制),int a=3,b=5,d;d=a&b?,将参与运算的两个操作数,按对应的二进制位分别进行以下运算,转化时右端对齐,如果位数不够,左边补符号位,即正数补0,负数补1.,2)再针对每个二进制位进行位运算,3)运算后
2、的结果转回为十进制,位运算符,1.按位与-&按位与运算:如果两个对应的位都是1,则该位为1,否则为0.,int a=3,b=5,d;d=a&b?,操作步骤 1)将运算分量转化为二进制(默认8位二进制)2)再针对每个二进制位进行位运算 3)结果转回十进制,0000 0011,0000 0101,&,1,0,0,0000 0,1,1)将a,b转化二进制2)进行位与运算3)将结果转回十进制,位运算符,2.按位或-|按位或运算:如果两个对应的位有一个1,则该位为1,否则为0.,int a=3,b=5,d;d=a|b?,操作步骤 1)将运算分量转化为二进制(默认8位二进制)2)再针对每个二进制位进行运算
3、 3)结果转回十进制,0000 0011,0000 0101,|,1,1,1,0000 0,7,1)将a,b转化二进制2)进行位或运算3)将结果转回十进制,位运算符,3.按位异或-按位异或运算:如果两个对应的位不同,则为1,否则为0.,int a=3,b=5,d;d=ab?,操作步骤 1)将运算分量转化为二进制(默认8位二进制)2)再针对每个二进制位进行运算 3)结果转回十进制,6,1)将a转化二进制2)进行位异或运算3)将结果转回十进制,0000 0011,0000 0101,0,1,1,0000 0,位运算符,4.按位取反-按位取反运算:如果位为1,则结果为0,如果位为0,结果为1.,in
4、t a=5,b;b=a?,操作步骤 1)将运算分量转化为二进制(默认8位二进制)2)再针对每个二进制位进行运算 3)结果转回十进制,0000 0101,0,1,0,1111 1,-6,注意:单目运算符,格式:a,1)将a转化二进制2)进行位取反运算3)将结果转回十进制,1000 0101,1000 0110,转十进制,除符号外,位取反,末尾+1,符号位为1,说明是负数,位运算符,5.位左移()将一个数的全部二进制位左移或右移若干位.,int a=5,b;b=a2;,操作步骤 1)将运算分量转化为二进制(默认8位二进制)2)再针对每个二进制位进行运算 3)结果转回十进制,20,1)左移时,低位补
5、02)右移时,对于正数,高位补0,对于负数,高位补1,格式:左边是移位处理的对象,右边是整数表达式,表示移动多少位a2,0000 0101,a2,0000 0101,a2,1,位运算符,3)优先级 取反 位移&位与 位异或|位或 4)结合性:取反是自右向左 其余是自左向右注意:1)位运算都只能针对整数和字符型数据 2&3 2&3.0错误2)位运算和赋值运算符一起构成复合赋值运算符&=,|=,=,=,将参与运算的两个操作数,按对应的二进制位分别进行以下运算,共 26 页 第 11 页,位运算符,举例:,int a=3,b=11;表达式a&b结果?,int a=3,b=11;表达式a|b结果?,0
6、000 0011,0000 1011,&,0000 1000,8,0000 0011,0000 1011,|,0000 1011,11,运算符,()括号 改变表达式中的优先级关系单目运算符+;-;!;-(负),*(指针),%=逗号运算符,高,低,预处理,预处理:程序被编译以前,编译系统会先对程序中三种特殊的命令进行”预先处理”,然后将预处理结果和源程序进行编译.,C语言程序的执行过程:,编写源程序(.c)编译程序(.obj)链接程序可执行程序(.exe)执行程序,获得结果,#define,#include,#ifdef.#endif,使用库函数时,包含相应头文件,用一个名字代替一个字符串,按照
7、不同条件选择编译不同的程序部分,预处理,1)编程人员为了缩短编写代码的长度,用宏定义说明用一个宏名代替一个长的字符串。2)在编程时,用到长字符串的地方用宏名替代,这个过程称为宏调用。3)在编译前,系统如何理解这些宏调用?根据宏定义,系统自动将所有宏名换回长字符串,这个过程称为宏展开.我们阅读别人编写的宏调用也做这样的替换,宏的使用:包括宏定义、宏调用和宏展开三部分,举例:#define PI 3.1415926main()int r=3;double s,d;d=2*PI*r;/*圆周长*/S=PI*r*r;/*面积*/,main()int r=3;double s,d;d=2*3.14159
8、26*r;/*圆周长*/S=3.1415926*r*r;/*面积*/,例如:#define PI 3.1415926,例如:S=PI*r*r;,预处理,使用宏的意义:,举例:#define PI 3.1415926main()int r=3;double s,d;d=2*PI*r;/*圆周长*/S=PI*r*r;/*面积*/,优点:1)用短小有意义的名字代替一长串的字符,减少输入量2)便于修改.修改一个地方,则全部修改,预处理,1)无参宏定义:,告诉系统,用标识符来表示一个字符序列,#define PI 3.1415926main()int r=3;double s,d;d=2*PI*r;/*
9、圆周长*/S=PI*r*r;/*面积*/,宏分为:无参宏和带参宏,格式:#define 标识符 字符序列,宏名,一般大写,不以分号结尾,定义符号常量的方法就是一种宏定义,宏定义写在函数的外面,一般在文件开头,2)无参宏调用:在程序里,用到字符序列的地方改用标识符,3)无参宏展开:系统自动将宏名替换为字符序列,宏定义命令,常数,表达式,d=2*3.1415926*rs=3.1415926*r*r;,预处理,进行宏定义时,可以引用已定义的宏名,可以层层替换,举例:#define R 3#define PI 3.1415926#define D 2*PI*Rmain()printf(“%f”,D);
10、,2*3.1415926*3,D,2*PI*R,预处理,1)带参宏定义:,3)带参宏定义的展开(系统如何理解带参的宏调用?):,举例:#define max(a,b)(ab)?a:bmain()int a=3,b=4,m;m=max(3,4);printf(“%d”,m);,格式:#define 标识符(形参列表)字符序列,多个参数由逗号分隔,#define max(a,b)(ab)?a:b,max(3,4),max(3,4)展开为 34?3:4,2)带参宏定义的调用:标识符(实参列表);,/*实参可以是数值和表达式*/,宏调用置换为字符序列.将字符序列中,所有形参符号(a,b)用实参符号(3
11、,4)来置换,替换的过程是简单的符号置换,结果:4,预处理,带参宏:,#define V(s1,s2)s1=i*w;s2=i*hmain()int i=3,w=4,h=5,a,b;V(a,b);printf(“a=%d,b=%d”,a,b);,V(a,b)置换为s1=i*w;s2=i*h,a=12,b=15;,将s1=i*w;s2=i*h中,所有的s1替换为a,s2替换为b,其余不变,形参符号:(s1,s2)实参符号:(a,b),a=i*w;b=i*h;,遇到宏调用,将宏调用置换为字符序列.将字符序列中,所有形参符号用实参符号来置换,替换的过程是简单的符号置换,预处理,带参宏:,#define
12、 S(x)x*xmain()int m;m=S(3);m=S(3+1);,注意:替换的过程是简单的字符置换,不做语法检查,(3+1)*(3+1)?,结果:3+1*3+1,举例:#define S(x)(x)*(x)main()m=S(3);m=S(3+1);,所以,宏定义中加上括号,提高程序安全性,16,7,3*3,将字符序列中,所有形参符号替换为对应实参符号,预处理,带参宏定义:,#define S(x)x*xmain()int m;m=S(3);,注意:s与(x)多一个空格,S变为一个无参宏,而宏调用出错,注意,在宏名和参数间没有空格,出错,预处理,举例:,#define N 3#defi
13、ne M(a,b)a%bmain()int x=3,y=5;printf(“%dn”,M(x+2,y+3);printf(“%dn”,N*M(x,y);,M(x+2,y+3)的宏展开?,8,x+2%y+3,N*M(x,y)的宏展开?,4,3*x%y,遇到宏调用,将宏调用置换为字符序列.将字符序列中,所有形参符号用实参符号来置换,替换的过程是简单的符号置换,预处理,举例:,#define M 3#define P(a,b)a%bmain()int a=5,b=8;int x,y;x=P(a+3,b);y=M*P(a,b);printf(“%dt%d”,x,y);,P(a+3,b)的宏展开?,x=8,a+3%b,M*P(a,b)的宏展开?,y=7,3*a%b,8 7,遇到宏调用,将宏调用置换为字符序列.将字符序列中,所有形参符号用实参符号来置换,替换的过程是简单的符号置换,