C语言程序设计第九章课件

上传人:我*** 文档编号:140093844 上传时间:2020-07-26 格式:PPT 页数:25 大小:200KB
返回 下载 相关 举报
C语言程序设计第九章课件_第1页
第1页 / 共25页
C语言程序设计第九章课件_第2页
第2页 / 共25页
C语言程序设计第九章课件_第3页
第3页 / 共25页
C语言程序设计第九章课件_第4页
第4页 / 共25页
C语言程序设计第九章课件_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《C语言程序设计第九章课件》由会员分享,可在线阅读,更多相关《C语言程序设计第九章课件(25页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计,主讲:龚文引,第九讲:预处理命令,提纲,宏定义,基本概念,C语言与其他高级语言的一个重要区别是可以使用预处理命令和具有预处理的功能 C提供的预处理功能主要有以下三种: 1. 宏定义 2. 文件包含 3. 条件编译 这些功能分别用宏定义命令、文件包含命令、条件编译命令来实现。为了与一般C语句相区别,这些命令以符号”#”开头。例如: #define, #include,9.1 宏定义,9.1.1 不带参数的宏定义 一般形式: #define 标识符 字符串 例如:#define PI 3.1415926 作用是在本程序文件中用指定的标识符PI来代替“3.1415926”这个字符串,

2、在编译预处理时,将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。 这种方法使用户能以一个简单的名字代替一个长的字符串,9.1 宏定义,例:使用不带参数的宏定义,#include #define PI 3.1415926 void main() float l,s,r,v; printf(input radius:); scanf(%f, ,9.1 宏定义,9.1.1 不带参数的宏定义 说明: 宏名一般习惯用大写字母表示,以便与变量名相区别。但这并非规定,也可用小写字母 使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量 宏定义是用宏名代替一个字符串,只作简单置

3、换,不作正确性检查。只有在编译已被宏展开后的源程序时才会发现语法错误并报错,9.1 宏定义,9.1.1 不带参数的宏定义 说明: 宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换 #define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,#define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效 可以用#undef命令终止宏定义的作用域 在进行宏定义时,可以引用已定义的宏名,可以层层置换,9.1 宏定义,#define #undef举例,#define G 9.8 void main() #undef G f1() ,在

4、f1函数中, G不再代表9.8. 这样 可以灵活控制宏定义的作用范围,9.1 宏定义,例:在宏定义中引用已定义的宏名,#include #define R 3.0 #define PI 3.1415926 #define L 2*PI*R #define S PI*R*R void main() printf(L=%fnS=%fn, L, S); ,L=18.849556 S=28.274333,经过宏展开后,printf函数中的输出项L被展开为: 2*3.1415926*3.0 S展开为 3.1415926*3.0*3.0,9.1 宏定义,9.1.1 不带参数的宏定义 对程序中用双撇号括起来

5、的字符串内的字符,即使与宏名相同,也不进行置换 例如: printf(“PI = %fn”, PI); 则输出结果为: PI = 3.141593 宏定义是专门用于预处理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间,9.1 宏定义,#include #define F x+y void main() int x=3,y=5,z; z=2*F; printf(n %d, z); ,11,#include #define F (x+y) void main() int x=3,y=5,z; z=2*F; printf(n %d, z); ,16,9.1 宏定义,9.1.

6、2 带参数的宏定义 作用:不是进行简单的字符串替换,还要进行参数替换 一般形式: #define 宏名(参数表列) 字符串 字符串中包含在括弧中所指定的参数,#define S(a,b) a*b . area=S(3,2); 程序中用3和2分别代替宏定义中的形式参数a和b,用3*2代替S(3,2) 。 因此赋值语句展开为:area=3*2,9.1 宏定义,带参的宏定义过程 对带实参的宏(如S(3,2),则按#define命令行中指定的字符串从左到右进行置换。若串中包含宏中的形参(如a、b),则将程序中相应的实参(可以是常量、变量或表达式)代替形参。如果宏定义中的字符串中的字符不是参数字符(如a

7、*b中的*号),则保留。这样就形成了置换的字符串,9.1 宏定义,带参宏定义说明: 对带参数的宏展开只是将语句中的宏名后面括号内的实参字符串代替#define 命令行中的形参,#include #define S(a, b) a*b void main() printf(“%dn”, S(2+3, 3+5); ,#include #define S(a, b) (a)*(b) void main() printf(“%dn”, S(2+3, 3+5); ,2+3*3+5,(2+3)*(3+5),9.1 宏定义,带参宏定义说明: 在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字

8、符都作为替代字符串的一部分,定义: #define S (r) PI*r*r 则 area = S(a)的展开为: area = (r) PI*r*r(a),9.1 宏定义,带参数的宏和函数的区别 函数调用时,先求出实参表达式的值,然后代入形参。而使用带参的宏只是进行简单的字符替换 函数调用是在程序运行时处理的,为形参分配临时的内存单元。而宏展开则是在编译前进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念 对函数中的实参和形参类型要求一致。而宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符串即可。宏定义时,字符串可以是任何类型的数据 调用函数只可

9、得到一个返回值,而用宏可以设法得到几个结果,9.1 宏定义,例: 通过宏展开得到若干个结果,#include #define PI 3.1415926 #define CIRCLE(R,L,S,V) L=2*PI*R;S=PI*R*R;V=4.0/3.0*PI*R*R*R void main() float r,l,s,v; scanf(%f, ,9.1 宏定义,对宏进行预编译,展开后的main函数如下:,void main() float r,l,s,v; scanf(%f, ,3.5 r=3.50,l=21.99,s=38.48,v=179.59,9.1 宏定义,带参数的宏和函数的区别 使

10、用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不会使源程序变长 宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回),如果善于利用宏定义,可以实现程序的简化. 比如: 事先将程序中的“输出格式”定义好,以减少在输出语句 中每次都要写出具体的输出格式的麻烦,9.1 宏定义,#include #define PR printf #define NL n #define D %d #define D1 D NL #define D2 D D NL #define D3 D D D NL #define D4 D D D D NL #de

11、fine S %s,void main() int a,b,c,d; char string=CHINA; a=1;b=2;c=3;d=4; PR(D1,a); PR(D2,a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,string); , ,9.1 宏定义,以下程序中, 有一个不符合C语法规则的语句, 这个语句是_,#include #define M 10 void main() int i, n, aM*10;/* A */ scanf(“%d”, /* D */ ,B,9.1 宏定义,以下程序的执行结果是_,#include #define SUB(

12、X,Y) (X)*Y void main() int a = 3, b = 4; printf(“%dn”, SUB(a+, b+); A. 12B. 15C. 16D. 20,A,9.1 宏定义,以下程序的执行结果是_,#include #define SUB(a) (a)-(a) void main() int a = 2,b = 3,c = 5, d; d = SUB(a+b)*c; printf(“%dn”,d); A. 0B. 10C. -12D. -20,D,9.1 宏定义,以下程序的执行结果是_,#include #define F x+y void main() int x=2,y=3, z = F; if ( x- 1 ) z = F*F; printf(%dn ,z); A. 5B. 7C. 16D. 25,B,本章学习到了,利用#define定义宏名,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号