文库网
ImageVerifierCode 换一换
首页 文库网 > 资源分类 > PPT文档下载
分享到微信 分享到微博 分享到QQ空间

《C语言程序设计》课件第八章11.ppt

  • 资源ID:16071746       资源大小:218.50KB        全文页数:22页
  • 资源格式: PPT        下载积分:15文币
微信登录下载
快捷下载 游客一键下载
账号登录下载
三方登录下载: QQ登录 微博登录
二维码
扫码关注公众号登录
下载资源需要15文币
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

《C语言程序设计》课件第八章11.ppt

1、6.7 6.7 编译预处理编译预处理 宏定义宏定义 文件包含文件包含 条件编译条件编译 基本内容:基本内容:6.7.1宏定义宏定义 宏定义宏定义:是用一个指定的名字来代表一个常量是用一个指定的名字来代表一个常量表达式或字符串,其复杂形式是带参数的表达式或字符串,其复杂形式是带参数的宏。宏。1.1.符号常量定义符号常量定义(1)(1)程序中常用到一些特别的量,如用程序中常用到一些特别的量,如用0 0或或1 1作条件判别作条件判别 量,用量,用-1-1表示文件结束,用表示文件结束,用21474836472147483647表示最大表示最大4 4 字节整数字节整数2 23131-1-1等,它们都常定

2、义成宏名。如:等,它们都常定义成宏名。如:#define NO 0#define NO 0#define YES 1#define YES 1#define EOF(-1)#define EOF(-1)(2)(2)宏名可定义为具有一定精度要求的宏名可定义为具有一定精度要求的floatfloat和和doubledouble类类 型值。如:型值。如:#define PI 3.14159#define PI 3.14159#define EPS 1.0e-9#define EPS 1.0e-9(3)宏名还可以定义为数组中最后一个元素的地址&aMAX-1。如:#define MAX 100#defin

3、e MAXP&aMAX-1(4)利用宏定义还可以把C语言语句的书写格式写成程 序员习惯的格式。如:预处理后:#define then end#define begin else if(ab)#define end;begin a:=b;#define:=c:=b;d:=(a+b)/2;.D:=(d*c)/2;if(ab)then end else begin c:=b;a:=b;d:=(a+b)/2;d:=(a+b)/2;利用宏定义将C写成PASCAL的格式对于宏需要注意的问题:(1)宏名习惯上用大写字母表示,表示与一般变量名相 区别。但这并非C语言的规定,也可以用小写字母。(2)宏定义不是C

4、语句,不必在行末尾加分号。若加,则会连分号一些进行置换,可能会出现语法错误。(3)字符串或字符常量中若有与宏名重名的,预处理程 序一律不将它们作为宏名对待,更不进行代换。例如:#define YES 1 printf(“YESn”);输出的是YES,而不是1。(4)在宏定义中,可以引用已经定义的宏名,可以进 行层层代换。例如:#define PI 3.14159#define R 3.0#define L 2*PI*R#define S PI*R*R(5)宏定义的有效范围为定义点到该源文件结束,还可 以用#undef命令终止宏定义的作用域。例如:#define P 100 main()#und

5、ef P f1()2.带参数的宏定义l 所谓带参数的宏定义是指宏名后带有形参表的宏定义。格式:#define 宏名(形参表)表达式 说明:宏定义中的形参在以后的程序中将以实参替换。置换过程:在程序中若有带参数的宏,则按#define命令行中指定的字符串从左到右进行置换。如果串中包含宏中的形式参数,则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参,如果宏定义中的字符串中的字符不是参数字符,则原样保留。常见的带参数宏定义的用法:(1)带参数的宏定义常用来代替一些简短的表达式。例如:#define MIN(x,y)(xy)?x:y)(2)带参数的宏定义也可以直接引用已定义过的宏定 义,即

6、实现宏定义的嵌套。例如:#define SQ(x)(x*x)#define FIFTH(x)CUBE(x)*(SQ(x)预处理程序对每个宏名展开代换,直到件中不再有宏名为止。(3)带参数的宏定义可以简化格式打印函数printf的格 式,提高程序的可读性。例如:#define NL putchar(n)#define PR(for,val)printf(val=%fort,val)#define PRINT1(f,x)PR(f,x);NL PRINT1(d,a+b)其宏展开为:PR(d,a+b);NL 又进一步展开为:printf(a+b=%dt,a+b);putchar(n)(1)在宏展开后容

7、易引起误解的表达式,在宏定义时,应将表达式用圆括号括起来。例如:#define S(a,b)a+b 若调用 v=S(2,3)*4;时,经宏展开后为:v=2+3*4;所以,原想先计算2+3,则变成先计算3*4了,故应将宏定义中的表达式用圆括号括起来,即成为:#define S(a,b)(a+b)由此可见,除非有理由不要圆括号,否则,一般都应将宏定义中的表达式用圆括号括起来。在使用带参数的宏定义时,要注意的问题:#define MIN(x,y)(x)k=10*x(b)?(a):(b),(a)(b)?(b):(a)宏定义与函数的区别:l(1)函数调用时是先计算实参表达式的值,然后l 将它代入形参。而

8、使用带参数的宏时只是进 l 行简单的字符代换。l(2)函数调用是在程序运行中处理的,临时给它l 分配存储单元。而宏展开是在编译时进行的,l 并不给它分配存储单元,不进行值的传递,l 也没有“返回值”。l(3)函数的实参、形参都要求定义类型,且二者类型l 必须一致,当不一致时,还要进行类型转换。而l 对宏不存在着类型问题,宏名无类型、参数无类l 型,都只是一种符号代表,宏展开时只是进行对l 应字符的代换。l(4)宏展开会使源程序增长。由于宏展开是在编译时l 进行的,故只占编译时间,不占运行时间。而函l 数调用不会使源程序变长。函数调用占运行时间l (分配单元,保存现场,值传递,返回等)。所l 以

9、,带参数的宏定义可以省去在程序中重复写相l 同的程序段,同时,在程序中 带参数的宏与函l 数调用不同,它不必为保存现场入栈、出栈,运l 行速度比函数调用快。6.7.2文件包含 文件包含:是指一个程序文件将另一个指定文 件的全部内容包含进来。格式:#include 被包含文件名 或#include“被包含文件名”说明:其中被包含文件名是一个已经存在于系 统中的文件的名字。被包含的文件称为“标题文件”或“头部文 件”,常以“.h”为后缀。注:文件包含预处理行可以使用一对尖括号或使用一对双引号“”将头部文件名括起来。尖括号:当用一对尖括号将头部文件名括起 来时,其意义是指示编译系统按系 统设定的标准

10、目录搜索头部文件。双引号:当用一对双引号将头部文件名括起来 时,其意义是指示编译系统先在源文 件所在的目录中搜索,若找不到时,则再按系统设定的标准搜索。文件包含在程序设计中的作用:(1)文件包含预处理行#include通常放在C程序的开头,其被包 含的文件内容常是一些公用的宏定义或外部变量的说明(注意,是用extern标识符的说明,不是外部变量的定义),当其出错,或因某种原因需要修改其内容时,只需修改相应的头部文件 内容,而不必修改使用它的程序文件,便于程序的更新维护。(2)可以节省程序设计人员的重复劳动。当程序员在工作中积累 了许多有价值的宏定义,或者编写了一些通用、常用的子程 序后,可将其

11、组成若干文件,在编写新程序时,可用文件包 含将其嵌进来,而不必重复地写这些宏定义或子程序。这就 好像使用企业标准件一样拿来就用,避免了重复性劳动,也 减少了因书写不专心导致出错的可能性。使用文件包含需要注意的问题:l 一个#include命令只能指定一个被包l 含的头部文件,若要包含多个,则应 l 该使用相应多个#include命令。l 文件包含可以嵌套,即被包含文件中l 还可以再包含另外的被包含文件。l 头部文件只能是ASCII 代码文件,而l 不能是目标代码文件。l 要调用标准数字库函数时,必须在文l 件开头用文件包含命令行。6.7.3条件编译 条件编译:条件编译:在编译C的源文件前,根据

12、给定的条件 决定编译的范围即所谓条件编译。说明:一般情况下,源程序中所有的行都参加编译。但有时希望对其中的一部分内容只在满足一 定条件下才进行编译,即对一部分内容指定 编译条件,当条件满足时,对一组语句进行 编译,而当条件不满足时,则对另一组语句 进行编译。这就是所谓的“条件编译”。条件编译的三种格式:1.条件编译命令格式一 格式:#ifdef 标识符 程序段1#else 程序段2#endif 功能:若标识符已经被定义过,则对程序段1进行 编译,否则,对程序段2进行编译。2.条件编译命令格式二格式:#ifndef 标识符 程序段1#else 程序段2#endif 说明:这种格式的条件编译功能与第一种格式的刚好相反,即:如果标识符未被定义过,则程序段1参加编译,否则程序段2参加编译。3.条件编译命令格式三 格式:#if 程序段1#else 程序段2#endif 功能:若指定表达式的值为真(非零),则程序 段1参加编译,否则程序段2参加编译。


注意事项

本文(《C语言程序设计》课件第八章11.ppt)为本站会员(bubibi)主动上传,文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文库网(点击联系客服),我们立即给予删除!




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

文库网用户QQ群:731843829  微博官方号:文库网官方   知乎号:文库网

Copyright© 2025 文库网 wenkunet.com 网站版权所有世界地图

经营许可证编号:粤ICP备2021046453号   营业执照商标

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png