1、单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第,5,讲编译预处理和位运算,一、编译预处理,1、宏定义,2、文件包含,二、位运算,1,、概念,:,用标识符来表示一个字符串,标识符叫宏名。,一、宏定义:,(P5),2,、无参宏定义,1,)无参宏定义的一般,格式,:,#define,标识符 字符串,例如:,#define PI 3.14159,2,)作用:,在宏定义之后,凡是该标识符出现的地方用对应的字符串来代替。,上面的定义之后,凡是,PI,都用,3.14159,来代替。,例,输入半径,计算以该半径为圆的周长与圆面积、球的体积与表面积。,#include ,
2、define PI 3.14159,void main(),float r,yzc,ymj,qbmj,qtj,;,scanf(%f,&r,);,yzc,=2*PI*r;,ymj,=PI*r*r;,qbmj,=4*PI*r*r;,qtj,=4*PI*r*r*r/3;,printf(%f,%f,%f,%fn,yzc,ymj,qbmj,qtj,);,3,、,带参数的宏定义,(P8),1,)带参宏定义的一般,格式,:,#define,标识符,(,参数表,),字符串,例如:,#define,ADD(x,y,),x+y,2,)作用:,在宏定义之后,凡是该标识符出现的地方用对应的字符串来代替,参数也作相应
3、的替换。,上面的定义之后,程序中如果出现,ADD(4,5),,则用,4+5,来代替,出现,ADD(a,b,),,则用,a+b,来代替。,#include ,#define PI 3.14159,#define,AREA(r,)PI*r*r,void main(),float,x,s,;,x=10.0;,s=,AREA(x,);,printf(s,=%.1fn,s);,写出下面程序的结果。,执行结果:,s=314.2,#include ,#define,ADD(x,y,),x+y,#define,MAX(x,y,)x,y?x:y,void main(),int,a=4,b=5,c,d;,c=,A
4、DD(a,b,);d=,MAX(a,b,);,printf(c,=%dtd=%,dn,c,d,);,float,w,z,;,w=ADD(5.6,-5.8);z=MAX(5.6,-5.8);,printf(w,=%.1ftz=%.1fn,w,z);,写出下面程序的结果。,执行结果:,c=5 d=5,w=-0.2 z=5.6,写出下面程序的结果。,#include ,#define,MUL(x,y,)x*y,void main(),int,a=3,b=4,c=5,d=6,m1,m2;,m1=,MUL(a,b,);,m2=,MUL(a+b,c+d,);,printf(m1=%dn,m1);,prin
5、tf(m2=%dn,m2);,执行结果:,m1=12,m2=29,修改方法,1,:,#include ,#define,MUL(x,y,),(x)*(y),void main(),int,a=3,b=4,c=5,d=6,m1,m2;,m1=MUL(a,b);,m2=MUL(,a+b,c+d,);,printf(m1=%dn,m1);,printf(m2=%dn,m2);,执行结果:,m1=12,m2=77,修改方法,2,:,#include ,#define,MUL(x,y,)x*y,void main(),int,a=3,b=4,c=5,d=6,m1,m2;,m1=,MUL(a,b,);,m
6、2=MUL(,(,a+b,),(,c+d,),);,printf(m1=%dn,m1);,printf(m2=%dn,m2);,执行结果:,m1=12,m2=77,1,、文件包含是,C,语言的一个重要功能,其作用是将另外一个文件的内容包含进来。,C,语言使用,#include,来实现,命令格式:,#include ,文件名,#include,二、,文件包含,(P10),例如:,#include ,stdio.h,#include,2,、文件包含通常用来解决程序使用,C,的库函数和公共符号常量的问题。例如:,sqrt,(),函数、,EOF,。,3,、两种格式的区别,#include “,文件名,
7、表示先在源程序文件的当前目录下查找文件,如果当前目录下未找到文件再到包含目录下查找。,#include,表示只在包含目录下查找。,包含目录是编译系统的一个参数,,在,VC 6.0,下通过“工具”菜单中的“选项”、“目录”来查询与设置,而在,DEV C+,下通过“工具”菜单中的“编译选项”、“目录”、“,C,包含文件”来查询与设置。,二、位运算,(P44),位是指二进制数中的一位,其值为,0,或者,1,。位运算包括,与、或、非、异或、左移、右移,。,参与位运算的两个操作数必须是,字符型,或者,整型,,,不能是实数,。如果是操作数是负数,则用操作数的,补码形式,参与运算;如果是操作数是字符,则
8、用操作数的,ASCII,码,参与运算。,在进行位运算时,最好把二个数化成二进制,然后根据位运算的运算规则进行计算。,每个位运算的规则是不变的,但计算结果可能与参与计算的,操作数的位数有关,。,1,、按位与运算,&,#include,void main(),char a=3,b=50;,printf(a&b,=%,dn,a&b,);,程序执行结果:,a&b,=2,例,1,写出下面程序的执行结果。,0000 0011=3,&0011 0010=50,0000 0010=2,规则:二个为,1,才为,1,,否则为,0,。,#include,void main(),char,a=-3,b=50,;,pr
9、intf(a&b,=%,dn,a&b,);,程序执行结果:,a&b,=48,例,2,写出下面程序的执行结果。,1111 1101=-3,&0011 0010=50,0011 0000=48,2,、按位或运算,|,#include,void main(),char a=3,b=50;,printf(a,|,b,=%,dn,a,|,b,);,程序执行结果:,a|b,=51,例,1,写出下面程序的执行结果。,0000 0011=3,|0011 0010=50,0011,0011,=51,规则:二个为,0,才为,0,,否则为,1,。,#include,void main(),char,a=-3,b=5
10、0,;,printf(a,|,b,=%,dn,a,|,b,);,程序执行结果:,a|b,=-1,例,2,写出下面程序的执行结果。,1111 1101=-3,|0011 0010=50,1111,1111,=-1,3,、按位异或运算,#include,void main(),char a=3,b=50;,printf(a,b,=%,dn,a,b,);,程序执行结果:,ab,=49,例,1,写出下面程序的执行结果。,0000 0011=3,0011 0010=50,0011 0001=49,规则:相同为,0,,相异为,1,。,#include,void main(),char,a=-3,b=50,
11、printf(a,b,=%,dn,a,b,);,程序执行结果:,ab,=-49,例,2,写出下面程序的执行结果。,1111 1101=-3,0011 0010=50,1100 1111=-49,4,、按位非运算,#include,void main(),char a=3;,printf(,a,=%,dn,a);,程序执行结果:,a=-4,例,1,写出下面程序的执行结果。,0000 0011=3,1111 1100=-4,规则:,0,变成,1,,,1,变成,0,。,#include,void main(),char a=,-,3;,printf(,a,=%,dn,a);,程序执行结果:,a=
12、2,例,2,写出下面程序的执行结果。,1111 1101=-3,0000 0010=2,5,、左移运算,#include,void main(),char a=3;,printf(a,2,=%,dn,a,2,);,程序执行结果:,a2=12,例,1,写出下面程序的执行结果。,规则:符号位参与移位,左边移出的位丢弃,右边补,0,。,#include,void main(),char a=,-,3;,printf(a,3,=%,dn,a,3,);,程序执行结果:,a,#include,void main(),char a=,24,;,printf(,a,2,=%,dn,a,2,);,程序执行结果:,a2=6,例,1,写出下面程序的执行结果。,规则:符号位,不,参与移位,右边移出的位丢弃。,#include,void main(),int,a=-50,b=127,;,printf(a,2=%,dn,a,2);,printf(b,2=%,dn,b,2);,程序执行结果:,a2=-13,b2=31,例,2,写出下面程序的执行结果。,规律:每右移,1,位相当于整除,2,。,






