资源描述:
《C语言程序设计技能教程 教学课件 作者 戴佩荣 等 第8章.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第8章编译预处理C语言技能教程第八章8.1技能1:掌握宏定义的使用8.2技能2:读懂含有包含文件的程序8.3技能3:读懂含有条件编译的程序C语言技能教程8.1技能1【知识点】1.预处理命令#define定义了一个标识符,并在每次出现标识符时用一个字符串去代替它。这个标识符称为“宏名”。而替换过程称为“宏代换”或“宏展开”。2.宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。3.无参宏的宏名后不带参数。其定义的一般形式为:#define标识符字符串8.1.1不带参数的宏定义C语言技能教程
2、8.1技能1【典型例题】例8.1写出下面程序段的运行结果。#defineM(2*y+3)main(){intz,y;printf("请输入一个数:");scanf("%d",&y);z=2*M*M+5*M+1;printf("z=%d",z);}8.1.1不带参数的宏定义C语言技能教程8.1技能1【典型例题】例8.2写出下面程序段的运行结果。#definePI3.14159#defineR2.0#defineSPI*R*Rmain(){floatz;z=3*S*S;printf("z=%f",z);}8.1.1不带参数的宏定义C语言技能教程
3、8.1技能1【典型例题】例8.3写出下面程序段的运行结果。#definePprintf#defineD"%d"#defineF"%f"main(){inta=1,b=2,c=3;floatd=1.5,e=2.6,f=3.7;P(DF,a,d);P(DF,b,e);P(DF,c,f);}8.1.1不带参数的宏定义C语言技能教程8.1技能1【点拨】8.1.1不带参数的宏定义1.宏代换就是一种简单的代换,宏定义用宏名表示一个字符串,在宏展开时用这个字符串取代宏名,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查,因此
4、如果有错误,只能在编译已经宏展开后的源程序时发现。2.在源程序中如果宏名用引号括起来,那么预处理程序则不对其作宏代换。3.宏定义允许嵌套,已经定义的宏名可以在宏定义的字符串中使用。由预处理程序在宏展开时层层代换。C语言技能教程8.1技能1【点拨】8.1.1不带参数的宏定义4.一般宏名用大写字母表示,以利于同变量区别,但也可以用小写字母表示。5.数据类型也可用宏定义来表示,使书写方便,但在使用时要小心,以免出错。6.宏定义不是说明,也不是语句,在行末不加分号。如果加上分号,则连分号也一起置换。7.宏定义必须写在函数的外面,其作用范围为从宏定义命令开始
5、到当前源程序结束。8.如果对“输出格式”作宏定义,则可以减少书写麻烦。C语言技能教程8.1技能1【知识点】1.在C语言中允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数。对带参数的宏,在调用时,不仅宏展开,而且用实际参数去代换形式参数。2.带参宏定义的一般形式为:#define宏名(形参表)字符串在字符串中含有各个形参。带参宏调用的一般形式为:宏名(实参表);8.1.2带参数的宏定义C语言技能教程8.1技能1【典型例题】例8.5输入任意二个整数,输出最大值。#defineMAX(a,b)(a>b)?a:bmain(){in
6、tx,y,max;printf("请输入二个数");scanf("%d%d",&x,&y);max=MAX(x,y);printf("max=%d",max);}8.1.2带参数的宏定义C语言技能教程8.1技能1【典型例题】例8.6计算x+1的平方值。#defineSQ(y)(y)*(y)main(){intx,sq;printf("请输入一个数:");scanf("%d",&x);sq=SQ(x+1);printf("sq=%d",sq);}8.1.2带参数的宏定义C语言技能教程8.1技能1【点拨】1.宏定义中的字符串内的形参通常要用括号
7、括起来,以免出错。不但应该在参数的两侧加上括号,还应该在整个字符串外加括号。2.在宏调用中的实参可以是表达式,而宏定义中的形参仅仅是标识符。3.在带参宏定义中,形参不分配内存单元,不必作类型定义。而宏调用中的实参有具体的值,要去代换形参,必须作类型说明。4.带参宏定义中,宏名和形参表之间不能有空格出现,否则空格以后的字符将作为代换字符串的一部分。8.1.2带参数的宏定义C语言技能教程8.1技能1【点拨】5.带参的宏和带参函数很相似,主要区别有:(1)带参的宏是简单的字符替换;而函数调用时,先求实参,后代入形参。(2)宏不存在类型问题;而函数中的实参
8、和形参都要定义一致的类型。(3)用宏可以设法得到几个结果;而调用函数只可得到一个返回值。(4)宏代换不占用运行时间,只占编