C语言程序设计课件.ppt

上传人:工**** 文档编号:567981753 上传时间:2024-07-22 格式:PPT 页数:34 大小:824.50KB
返回 下载 相关 举报
C语言程序设计课件.ppt_第1页
第1页 / 共34页
C语言程序设计课件.ppt_第2页
第2页 / 共34页
C语言程序设计课件.ppt_第3页
第3页 / 共34页
C语言程序设计课件.ppt_第4页
第4页 / 共34页
C语言程序设计课件.ppt_第5页
第5页 / 共34页
点击查看更多>>
资源描述

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

1、第九章第九章 编译预处理编译预处理9.19.1宏定义宏定义 9.29.2文件包含处理文件包含处理9.39.3条件编译条件编译 9.49.4 带参数的主函数带参数的主函数 概概 述述 在前面各单元中我们已经使用了部分以“#”符号开头的命令。例如,# define、# include等。这些命令是在源程序正式编译前进行处理的,称为“编译预处理”命令。编译预处理主要包括宏的处理、包含文件的处理、条件编译的处理等。宏定义宏定义 1、不带参数的宏定义、不带参数的宏定义 用一个指定的标识符(即名字)来代表一个字符串它的一般形式为 define 标识符标识符 字符串字符串这就是已经介绍过的定义符号常量。如:

2、define PI 3.1415926#define PI 3.1415926main()float l,s,r,v; printf(“input radius:”); scanf(“%f”,&r); l=2.0*PI*r; s=PI*r*r; v=3.0/4*PI*r*r*r; printf(“l=%10.4fns=%10.4fnv=%10.4fn”,l,s,v);例例1:下面的程序使用了宏定义,给出其运行结果:下面的程序使用了宏定义,给出其运行结果运行情况如下:input radius:4l=25.1328s=50.2655v=150.79663、说明:、说明: (1)宏名一般习惯用大写字

3、母表示,以便与变量名相区别。(2)使用宏名代替一个字符串,可以减少程序中重复书写某些字符串的工作量。(3)宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查。(4)宏定义不是C语句,不必在行末加分号。如果加了分号则会连分号一起进行置换。如:define PI 3.1415926; areaPI* r* r;经过宏展开后,该语句为area 3.1415926;* r* r ;显然出现语法错误。(5)define命令出现在程序中函数的外面,宏名的有效范围为定义命令之后到本源文件结束。通常,define命令写在文件开头,函数之前,作为文件一部分,在此文件范围内有效。(6)可以用unde

4、f命令终止宏定义的作用城。例如:# define G 9.8main() . . .# undef Gf1() . . .G的有效范围(7)在进行宏定义时,可以引用已定义的宏名,可以层层置换。#define R 3.0#define PI 3.1415926#define L 2*PI*R#define S PI*R*Rmain() printf(“L=%fnS=%fn”,L,S);例例2 分析下面程序的运行结果分析下面程序的运行结果运行情况如下:L=18.849556S=28.274333 (8)对程序中用双括号括起来的字符串内的字符,即使与宏名相同,也不进行置换。(9)宏定义是专门用于预处

5、理命令的一个专用名词,它与定义变量的含义不同,只作字符替换,不分配内存空间。4、带参数的宏定义、带参数的宏定义 带参数的宏定义除了字符串替换之外,还要进行参数的替换。定义的一般形式为define 宏名(参数表)宏名(参数表) 字符串字符串字符串中包含在括弧中所指定的参数。如:define S(a,b) a *b area=S(3,2);例例3:分析下面程序的运行结果:分析下面程序的运行结果#define PI 3.1415926#define S(r) PI*r*rmain()float a,area; a=3.6; area=S(a); printf(“r=%fnarea=%fn”,a,ar

6、ea);运行结果如下:r=3.600000area=40.715038赋值语句area=S(a);经宏展开后为area=3.1415926*a*a 5、说明:、说明:(1)对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替define命令行中的形参。(2)在宏定义时,在宏名与带参数的括弧之间不应加空格,否则将空格以后的字符都作为替代字符串的一部分。例如,如果有 define S (r) PI*r*r 被认为S是符号常量(不带参的宏名),它代表字符串“(r)PIrr”。如果在语句中有 area=S (a);则被展开为 area=(r) PI*r*r (a)显然不对了。(3)带参的宏定

7、义与函数是不同的。主要有:函数调用时,先求出实参表达式的值,然后带入形参。而使用带参的宏只是进行简单的字符替换。函数调用是在程序运行时处理的,分配临时的内存单元。而宏展开则是在编译时进行的,在展开时并不分配内存单元,不进行值的传递处理,也没有“返回值”的概念。对函数中的实参和形参都要定义类型,二者的类型要求一致,如不一致,应进行类型转换。而宏不存在类型问题,宏名无类型,它的参数也无类型,只是一个符号代表,展开时代入指定的字符即可。宏定义时,字符串可以是任何类型的数据。例如:define CHAR1 CHINA(字符) define a 3.6(数值)调用函数只可得到一个返回值,而用宏可以设法得

8、到几个结果。使用宏次数多时,宏展开后源程序长,因为每展开一次都使程序增长,而函数调用不使源程序变长。宏替换不占运行时间,只占编译时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。一般用宏来代表简短的表达式比较合适。有些问题,用宏和函数都可以。如:define MAX(x,y) (x)(y)? (x):(y)main() int a,b,c,d,t; t= MAX(a+b,c+d); 赋值语句展开后为 t(ab)(cd)? (ab):(cd);注意:注意:MAX不是函数,这里只有一个宏,在main函数中就能求出t的值。这个问题也可用函数来求:int max(int x,int y

9、) return(xy?x:y);main() int a,b,c,d,t; t= max(a+b,c+d); max是函数,在main函数中调用max函数才能求出t的值。#define PR printf#define NL n”#define D ”%d#define E %d#define D1 D NL#define D2 D E NL#define D3 D E E NL#define D4 D E E E NL#define S “%s”main()int a,b,c,d; char string=“CHINA”; a=1,b=2,c=3,d=4; PR(D1,a); PR(D2,

10、a,b); PR(D3,a,b,c); PR(D4,a,b,c,d); PR(S,string); 例例4:分析下面程序的运行结果:分析下面程序的运行结果:运行时输出以下结果:1121231234CHINA 文件包含命令可以将另一个C源程序的全部内容包含进来,它可以避免不必要的重复劳动。 文件包含处理文件包含处理 1、一般形式:、一般形式:include “文件名文件名” 或 include 2、例:可以将例、例:可以将例4 4程序改为:程序改为: (1)文件format.h #define PR printf #define NL n” #define D “%d #define E %d

11、#define D1 D NL #define D2 D E NL #define D3 D E E NL #define D4 D E E E NL #define S “%s”(2)文件file1.c #include “format.h” 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); 3、说明说明(1)一个include命令只能指定一个被包含文件,如果要包含n个文件,要用n个include

12、命令。(2)如果文件1包含文件2,而文件2中要用到文件3的内容,则可在文件1中用两个include命令分别包含文件2和文件3,而且文件3应出现在文件2之前,即在filel.c中定义:include “file3.h”include “file2.h”(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。(4)在include命令中,文件名可以用双引号或尖括号括起来。二者的区别是用尖括号(即=a&c=A&c命令动词 参数表”。其中参数表被称为命令行参数。 其中,argc表示命令行参数的个数,指针数组argv分别指向命令行各参数的首地址。 在编辑C语言源程序时,main()函

13、数可带有两个形参,形式为: void main(int argc,char *argv)例如:取名file.c的文件经过编译、连接后产生file.exe,在DOS提示符下输入如下字符串时: c:file parameter1 parameter2则程序运行时,系统自动将命令行参数的个数3赋给argc。其中, argv0指向字符串“file”的首地址; argv1指向字符串“parameter1”的首地址; argv2指向字符串“parameter2”的首地址。如果文件名前有路径,它们都保存在argv0中。例:如下带参数的主函数#include stdio.hvoid main(int argc

14、,char *argv) int i;for(i=1;iargc;i+)printf(%sn,argvi);通过编译生成file可执行文件后,在DOS的提示符下输入file hello world,则程序输出为: hello world1、给出下面程序宏替换后的结果。#definePI3.1415926#defineR3.0#defineL2*PI*R#defineSPI*R*Rmain()printf(l=%fns=%fn,L,S);课堂练习答案:第 一 次 替 换 :printf(l=%fns=%fn,2*PI*R,PI*R*R);第 二 次 替 换 :printf(l=%fns=%fn,

15、2*3.1415926*3.0,3.1415926*3.0*3.0);分析:学习宏替换要注意以下几点:宏名一般习惯用大写字母,以便与变量名相区别;宏替换由编译程序预先进行;宏名用作代替一个字符串,不作语法检查;宏替换范围是除用双引号引起来的字符串以外的所有宏名字。(4)若替换后文本串中仍含有宏名字,将再次进行替换,直到程序中不含宏名字为止。(5)宏定义不是语句,所以不能在行尾加分号。否则,宏展开时,会将分号作为字符串的1个字符,用于替换宏名。C语言允许宏定义出现在程序中函数外面的任何位置,但一般情况下它总写在文件的开头。2给出下面程序宏替换后的结果。#definePF(x)x*x/*#defi

16、nePF(x)(x)*(x)*/*#definePF(x)(x)*(x)*/main()inta=2,b=3,c;c=PF(a+b)/PF(a+1);printf(nc=%d,c);答案:(1)按第一种宏定义:c=a+b*a+b/a+1*a+1;(2)按第二种宏定义:c=(a+b)*(a+b)/(a+1)*(a+1);(3)按第三种宏定义:c=(a+b)*(a+b)/(a+1)*(a+1);分析:(1)定义有参宏时,宏名与左圆括号之间不能留有空格。否则,编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏。 (2)有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查。在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号。4输入一行字母,根据需要设置条件编译,使之能将字母全改为大写输出,或全改为小写字母输出。 答案:#include #define LETTER 1main()char str20=“C Language”, c;int i = 0;while (c=stri+)!=0) #if LETTERif (c = a & c = A & c = Z)c = c-A+a;#endifprintf(“%c”, c);

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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