全国计算机等级考试2C课程第10讲-预编译处理课件_第1页
全国计算机等级考试2C课程第10讲-预编译处理课件_第2页
全国计算机等级考试2C课程第10讲-预编译处理课件_第3页
全国计算机等级考试2C课程第10讲-预编译处理课件_第4页
全国计算机等级考试2C课程第10讲-预编译处理课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

全国计算机等级考试2C课程第十讲编译预处理命令12/24/20221作者:张旭仟版权所有欢迎盗版全国计算机等级考试2C课程第十讲编译预处理命令12/19编译预处理命令的基本概念ANSIC规定,可以在C源程序中加入一些“编译预处理命令”,以改进程序设计环境,提高编程效率。例如:#definePI3.14159#include<stdio.h>虽然这些“编译预处理命令”也是由ANSIC统一规定的,但它们并非C语言的组成部分。含有这种“编译预处理命令”的源程序,只有在正式编译之前先对它们进行“预处理”后,才能被正常编译成“目标程序”。C语言提供的预处理命令主要有:宏定义命令、文件包含命令、条件编译命令。为了与一般C语句相区别,这些编译预处理命令”都以“#”号开头。12/24/20222作者:张旭仟版权所有欢迎盗版编译预处理命令的基本概念ANSIC规定,可以在C源程序中加不带参数的宏替换命令不带参数的宏替换命令一般形式:#define标识符字符串例如:#definePI3.1415926其中“#define”是宏定义命令,PI称为“宏名”,“3.1415926”称为宏体。作用是将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。在预编译时将宏名替换成字符串的过程称为“宏展开”。12/24/20223作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令不带参数的宏替换命令12/19/2022不带参数的宏替换命令说明:(1)#define命令、宏名、宏体之间必须用空格隔开;(2)由于宏定义不是C语言程序语句,行的末尾不需要加“;”号;如果加了分号则会作为宏体的一部分被一起置换。(3)宏名习惯上一般用大写字母表示,以便与普通变量名区别。但这并非语法规定,即用小写字母并不属于语法错误;(4)程序中被加上双引号“”的宏名,将不能被替换,如:printf(“PI”);语句中的PI不会被替换为3.1415926;(5)适当使用宏名代替一个字符串,可以减少程序中重复书写某些复杂数据的工作量。12/24/20224作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令说明:12/19/20224作者:张旭仟不带参数的宏替换命令例如:#include<stdio.h>#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);}运行情况如下:1=25.1328s=50.2655v=150.796612/24/20225作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令例如:#include<stdio.不带参数的宏替换命令(6)宏定义是用宏名代替一个字符串,只作简单置换,并不对字符串(宏体)作正确性检查。(7)#define命令通常写在文件开头或函数之前。默认情况下,宏名的有效范围,是从宏定义命令之后开始,直到本源文件结束。(8)当然,也可以用#undef命令,提前终止宏定义的作用范围。如:#defineG9.8__voidmain(){G的有效范围…}__#undefGf1(){…}12/24/20226作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令(6)宏定义是用宏名代替一个字符串,只不带参数的宏替换命令(9)在进行宏定义时,可以引用已定义的宏名,宏展开时将会层层置换。例如:

#include<stdio.h>#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%f\nS=%f\n",L,S);}编译预处理时:printf(“L=%f\nS=%f\n”,L,S);语句将被展开为printf(“L=%f\nS=%f\n”,2*3.1415926*3.0,3.1415926*3.0*3.0);12/24/20227作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令(9)在进行宏定义时,可以引用已定义的带参数的宏定义带参数的宏定义作用:不只进行简单的字符串替换,还进行参数的替换。一般形式为:#define宏名(参数表)字符串

例如:#defineS(a,b)a*b

area=S(3,2);说明:程序中用3和2分别代替宏定义中的形式参数a和b,用3*2代替S(3,2)。因此赋值语句展开为:area=3*212/24/20228作者:张旭仟版权所有欢迎盗版带参数的宏定义带参数的宏定义例如:说明:12/19/2022带参数的宏定义对带参的宏定义是这样展开置换的:对带实参的宏,如S(3,2),基本原则也是按define命令行中指定的字符串从左到右进行置换的。但如果字符串中包含有宏名中定义的形参,如:“a*b”中的a和b,则要用程序中相应的实参(可以是常量、变量或表达式)来代替;其他字符,如“a*b”中的*号,则原样保留。图中S(3,2)将被置换为3*2,其中3和2是实参,将代替指定字符串a*b中的a和b,*不是参数,则被原样保留。12/24/20229作者:张旭仟版权所有欢迎盗版带参数的宏定义对带参的宏定义是这样展开置换的:图中S(3,2带参数的宏定义例如:#include<stdio.h>#definePI3.1415926#defineS(r)PI*r*rvoidmain(){floata,area;a=3.6;area=S(a);printf("r=%f\narea=%f\n",a,area);}说明:赋值语句“area=S(a);”展开后被替换为:area=3.1415926*a*a;运行结果:r=3.600000area=40.71503812/24/202210作者:张旭仟版权所有欢迎盗版带参数的宏定义例如:#include<stdio.h>说文件包含命令所谓“文件包含”,是指一个源文件可以将另外一个源文件的全部内容包括进来。C语言提供了#include命令用来实现“文件包含”的操作。其一般形式为:#include"文件名"或#include<文件名>说明:(1)在#include命令中,文件名可以用双撇号或尖括号括起来。(2)一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令。12/24/202211作者:张旭仟版权所有欢迎盗版文件包含命令所谓“文件包含”,是指一个源文件可以将另外一个源文件包含命令说明:(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。如下图所示#include<file2.c>A#include<file3.c>BCfile1.cfile2.cfile3.cCBC12/24/202212作者:张旭仟版权所有欢迎盗版文件包含命令说明:#include<file2.c>A#i小练习:1、以下叙述中错误的是(2008年4月)A)在程序中凡是以“#”开始的语句行都是预处理命令行B)预处理命令行的最后不能以分号表示结束C)#defineMAX是合法的宏定义命令行D)C程序对预处理命令行的处理是在程序执行的过程中进行的12/24/202213作者:张旭仟版权所有欢迎盗版小练习:1、以下叙述中错误的是(2008年4月)12/1小练习:2、有以下程序(2010年3月)#include<stdio.h>#defineSUB(a)(a)-(a)main(){ inta=2,b=3,c=5,d; d=SUB(a+b)*c; printf("%d\n",d);}程序运行后的输出结果是A)0 B)-12 C)-20 D)1012/24/202214作者:张旭仟版权所有欢迎盗版小练习:2、有以下程序(2010年3月)12/19/202小练习:3、有以下程序(2009年9月)#include<stdio.h>#definef(x)x*x*xmain(){ inta=3,s,t;3+1*3+1*3+1 s=f(a+1); t=f((a+1)); printf("%d,%d",s,t);}程序运行后的输出结果是 A)10,64B)10,10 C)64,10 D)64,6412/24/202215作者:张旭仟版权所有欢迎盗版小练习:3、有以下程序(2009年9月)12/19/202小练习:4、有以下程序#include<stdio.h>#definePT3.5;#defineS(x)PT*x*x;mian(){ inta=1,b=2; printf(“%4.1f\n”,S(a+b)); 3.5*1+2*1+2}程序运行后输出的结果是A)14.0 B)31.5 C)7.5 D)程序有错无输出结果12/24/202216作者:张旭仟版权所有欢迎盗版小练习:4、有以下程序12/19/202216作者:张旭仟小练习:5、有一个名为init.txt的文件,内容如下:#defineHDY(A,B)A/B#definePRINT(Y)printf(“y=%d\n”,Y)有以下程序#include"stdio.h"#include"init.txt"main(){ inta=1,b=2,c=3,d=4,k; k=HDY(a+c,b+d); PRINT(k);}下面针对该程序的叙述正确的是(D)A)编译有错 B)运行出错 C)运行结果为y=0 D)运行结果为y=612/24/202217作者:张旭仟版权所有欢迎盗版小练习:5、有一个名为init.txt的文件,内容如下:1

Thanklisten!12/24/202218作者:张旭仟版权所有欢迎盗版Thanklisten!12/19/202218作者:张全国计算机等级考试2C课程第十讲编译预处理命令12/24/202219作者:张旭仟版权所有欢迎盗版全国计算机等级考试2C课程第十讲编译预处理命令12/19编译预处理命令的基本概念ANSIC规定,可以在C源程序中加入一些“编译预处理命令”,以改进程序设计环境,提高编程效率。例如:#definePI3.14159#include<stdio.h>虽然这些“编译预处理命令”也是由ANSIC统一规定的,但它们并非C语言的组成部分。含有这种“编译预处理命令”的源程序,只有在正式编译之前先对它们进行“预处理”后,才能被正常编译成“目标程序”。C语言提供的预处理命令主要有:宏定义命令、文件包含命令、条件编译命令。为了与一般C语句相区别,这些编译预处理命令”都以“#”号开头。12/24/202220作者:张旭仟版权所有欢迎盗版编译预处理命令的基本概念ANSIC规定,可以在C源程序中加不带参数的宏替换命令不带参数的宏替换命令一般形式:#define标识符字符串例如:#definePI3.1415926其中“#define”是宏定义命令,PI称为“宏名”,“3.1415926”称为宏体。作用是将程序中在该命令以后出现的所有的PI都用“3.1415926”代替。在预编译时将宏名替换成字符串的过程称为“宏展开”。12/24/202221作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令不带参数的宏替换命令12/19/2022不带参数的宏替换命令说明:(1)#define命令、宏名、宏体之间必须用空格隔开;(2)由于宏定义不是C语言程序语句,行的末尾不需要加“;”号;如果加了分号则会作为宏体的一部分被一起置换。(3)宏名习惯上一般用大写字母表示,以便与普通变量名区别。但这并非语法规定,即用小写字母并不属于语法错误;(4)程序中被加上双引号“”的宏名,将不能被替换,如:printf(“PI”);语句中的PI不会被替换为3.1415926;(5)适当使用宏名代替一个字符串,可以减少程序中重复书写某些复杂数据的工作量。12/24/202222作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令说明:12/19/20224作者:张旭仟不带参数的宏替换命令例如:#include<stdio.h>#definePI3.1415926voidmain(){floatl,s,r,v;printf("inputradius:");scanf("%f",&r);l=2.0*PI*r;s=PI*r*r;v=4.0/3*PI*r*r*r;printf("l=%10.4f\ns=%10.4f\nv=%10.4f\n",l,s,v);}运行情况如下:1=25.1328s=50.2655v=150.796612/24/202223作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令例如:#include<stdio.不带参数的宏替换命令(6)宏定义是用宏名代替一个字符串,只作简单置换,并不对字符串(宏体)作正确性检查。(7)#define命令通常写在文件开头或函数之前。默认情况下,宏名的有效范围,是从宏定义命令之后开始,直到本源文件结束。(8)当然,也可以用#undef命令,提前终止宏定义的作用范围。如:#defineG9.8__voidmain(){G的有效范围…}__#undefGf1(){…}12/24/202224作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令(6)宏定义是用宏名代替一个字符串,只不带参数的宏替换命令(9)在进行宏定义时,可以引用已定义的宏名,宏展开时将会层层置换。例如:

#include<stdio.h>#defineR3.0#definePI3.1415926#defineL2*PI*R#defineSPI*R*Rvoidmain(){printf("L=%f\nS=%f\n",L,S);}编译预处理时:printf(“L=%f\nS=%f\n”,L,S);语句将被展开为printf(“L=%f\nS=%f\n”,2*3.1415926*3.0,3.1415926*3.0*3.0);12/24/202225作者:张旭仟版权所有欢迎盗版不带参数的宏替换命令(9)在进行宏定义时,可以引用已定义的带参数的宏定义带参数的宏定义作用:不只进行简单的字符串替换,还进行参数的替换。一般形式为:#define宏名(参数表)字符串

例如:#defineS(a,b)a*b

area=S(3,2);说明:程序中用3和2分别代替宏定义中的形式参数a和b,用3*2代替S(3,2)。因此赋值语句展开为:area=3*212/24/202226作者:张旭仟版权所有欢迎盗版带参数的宏定义带参数的宏定义例如:说明:12/19/2022带参数的宏定义对带参的宏定义是这样展开置换的:对带实参的宏,如S(3,2),基本原则也是按define命令行中指定的字符串从左到右进行置换的。但如果字符串中包含有宏名中定义的形参,如:“a*b”中的a和b,则要用程序中相应的实参(可以是常量、变量或表达式)来代替;其他字符,如“a*b”中的*号,则原样保留。图中S(3,2)将被置换为3*2,其中3和2是实参,将代替指定字符串a*b中的a和b,*不是参数,则被原样保留。12/24/202227作者:张旭仟版权所有欢迎盗版带参数的宏定义对带参的宏定义是这样展开置换的:图中S(3,2带参数的宏定义例如:#include<stdio.h>#definePI3.1415926#defineS(r)PI*r*rvoidmain(){floata,area;a=3.6;area=S(a);printf("r=%f\narea=%f\n",a,area);}说明:赋值语句“area=S(a);”展开后被替换为:area=3.1415926*a*a;运行结果:r=3.600000area=40.71503812/24/202228作者:张旭仟版权所有欢迎盗版带参数的宏定义例如:#include<stdio.h>说文件包含命令所谓“文件包含”,是指一个源文件可以将另外一个源文件的全部内容包括进来。C语言提供了#include命令用来实现“文件包含”的操作。其一般形式为:#include"文件名"或#include<文件名>说明:(1)在#include命令中,文件名可以用双撇号或尖括号括起来。(2)一个#include命令只能指定一个被包含文件,如果要包含n个文件,要用n个#include命令。12/24/202229作者:张旭仟版权所有欢迎盗版文件包含命令所谓“文件包含”,是指一个源文件可以将另外一个源文件包含命令说明:(3)在一个被包含文件中又可以包含另一个被包含文件,即文件包含是可以嵌套的。如下图所示#include<file2.c>A#include<file3.c>BCfile1.cfile2.cfile3.cCBC12/24/202230作者:张旭仟版权所有欢迎盗版文件包含命令说明:#include<file2.c>A#i小练习:1、以下叙述中错误的是(2008年4月)A)在程序中凡是以“#”开始的语句行都是预处理命令行B)预处理命令行的最后不能以分号表示结束C)#defineMAX是合法的宏定义命令行D)C程序对预处理命令行的处理是在程序执行的过程中进行的12/24/202231作者:张旭仟版权所有欢迎盗版小练习:1、以下叙述中错误的是(2008年4月)12/1小练习:2、有以下程序(2010年3月)#include<stdio.h>#defineSUB(a)(a)-(a)main(){ inta=2,b=3,c=5,d; d=SUB(a+b)*c; printf("%d\n",d);}程序运行后的输出结果是A)0 B)-12 C)-20 D)1012/24/202232作者:张旭仟版权所有欢迎盗版小练习:2、有以下程序(2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论