C语言课件 第7章 编译预处理.ppt

C语言课件 第7章 编译预处理.ppt

ID:57057176

大小:172.50 KB

页数:16页

时间:2020-07-30

C语言课件 第7章 编译预处理.ppt_第1页
C语言课件 第7章 编译预处理.ppt_第2页
C语言课件 第7章 编译预处理.ppt_第3页
C语言课件 第7章 编译预处理.ppt_第4页
C语言课件 第7章 编译预处理.ppt_第5页
资源描述:

《C语言课件 第7章 编译预处理.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第九章编译预处理§9.1宏定义宏:代表一个字符串的标识符。宏名:被定义为“宏”的标识符。宏代换(展开):在编译预处理时,对程序中所有出现的“宏名”,用宏定义中的字符串去代换的过程。一、不带参数的宏定义一般形式:#define标识符字符串例9.1#definePI3.1415926 main() {floatl,s,r,v; printf(“inputradius:”); scanf(“%f”,&r); l=2.0*PI*r; s=PI*r*r; v=3.0/4*PI*r*r*r; printf(“%10.4f,%10.4f,%10.4”,l,s,v);}

2、运行情况如下:inputradius:4l=25.1328s=50.2655v=268.082例如由键盘输入y值,求表达式: 3(y2+3y)+4(y2+3y)+y(y2+3y)#defineM(y*y+3*y)main(){ints,y;printf(“Inputanumber:”);scanf(“%d”,&y);s=3*M+4*M+y*M;printf(“s=%d”,s);}先宏展开:s=3*(y*y+3*y)+4*(y*y+3*y)+y*(y*y+3*y)再与源程序合并。说明:⑴宏名一般用大写表示,以便与变量名区分。⑵使用宏名使程序易读,易修改。⑶

3、只作简单的置换,不作正确性检查。⑷宏定义不是C语句,不必在行末加分号。⑸宏名的作用域一般从自定义命令到本源文件结束。⑹可以用#undef命令终止宏定义的作用域。#defineG9.8mai(){G的有效范围}#undefGf1()#definePI3.14l59即把数字1写成字母l了,预处理也照样代入,不管含义是否正确。只有在编译已经被展开后的源程序时才报错。⑺宏定义允许嵌套,允许层层置换。⑻宏名在源程序中用双引号括起来,则TC中预处理不对其作宏代换。例:⑼宏定义与定义的变量不同,宏只作字符替换,不分配内存空间。⑽对“输出格式”进行宏定义,可以减少书写麻烦。

4、详细见下例。#defineR3.0#definePI3.1415926#defineL2*PI*Rmain(){……printf(“L=%f”,L);/*中双引号内L不替换*/……}宏定义嵌套例如:#definePprintf#defineD“%d,%d,%d”#defineF“%6.2f,%6.2f,%6.2f”main(){inta=5,c=8,e=11;floatb=3.8,d=9.7;f=21.08;P(D,a,c,e);P(F,b,d,f);P(F,a+b,c+d,e+f);}对“输出格式”进行宏定义减少代码的书写二、带参数的宏定义不是进行

5、简单的字符串替换,还要进行参数替换。其定义的一般形式为:格式:#define宏名(参数表)字符串例:#defines(a,b)a*b {…… area=s(3,2); ……} 对带参的宏展开后,为area=3*2;例:#defineM(y)y*y+3*y {…… k=M(5); ……} 对其展开后,为k=5*5+3*5;说明:⑴对带参数的宏展开只是将宏名后括号内的实参字符串代替#define命令行中的形参。⑵宏定义时,在宏名与带参数的括号之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。#definePI3.14159#defineS(r)PI*

6、r*rmain(){floata,area;a=3.6;area=S(a);printf(“r=%farea=%f”,a,area);}运行结果如下:r=3.600000area=40.715038赋值语句area=S(a);经宏展开后为area=3.14159*a*a;例如,若有#defineS▄(r)▄PI*r*r被认为:S是符号常量(不带参的宏名),它代表字符串“(r)▄PI*r*r”。如果在语句中有area=S▄(a);则被展开为area=(r)▄PI*r*r▄(a)显然不是正确的。⑶带参宏定义,形参不分配内存单元,因此不必作类型定义。(与函

7、数的区别之一)⑷带参宏与函数的区别之二:例如:main() {inti=1; while(i<=5)printf(“%dt”,SQ(i++));}SQ(inty) {return(y)*(y);}其结果为:1491625如:#defineSQ(y)((y)*(y))main(){inti=1;while(i<=5)printf(“%dt”,SQ(i++));}运行结果: 21230例:利用宏定义求两个数中的大数。#defineMAX(a,b)(a>b)?a:bmain(){intx,y,max;scanf(“%d%d”,&x,&y);max=MAX(x,

8、y);printf(“max=%d”,max);

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。