《《函数与预处理》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《函数与预处理》PPT课件.ppt(48页珍藏版)》请在三一办公上搜索。
1、第4章 函数与预处理,一.函数的概念、分类及定义,第4章 函数与预处理,函数的概念,逻辑上独立的、完成指定功能的一段代码,是编译的最小单位.有的程序设计语言分成子程序和函数两种,如 Basic,Fortran等.,由一个main函数及若干个其它函数组成.,另外,在main函数前还可以定义全局变量,声明所用函数.,C程序的结构,函数可看作为一个“黑箱”,通过参数和返回值与外界进行数据交换.,C+的程序结构,第4章 函数与预处理,一个程序中有且只能有一个main函数;函数的定义是独立的,不能嵌套定义;函数可以相互调用,但不能调用main函数;在函数被调用之前,必须先定义或声明.,关于函数的几点规定
2、,函数是模块化程序设计的基本单位,C程序就是由函数组成,因此被认为是面向函数的语言;C+采用类结构设计方式,将对象的数据及操作(函数)捆绑起来,封装于类中,如下图.,函数的分类,从用户使用的角度看,可分成两类:,标准库函数:编译系统自带的函数,用户只需在程序中包含相应的头文件,就可以调用.在连接时,系统会将相应的代码连接到用户的执行程序中.,VC+几个常用的头文件及库函数:,输入/输出库(iostream):getchar,gets,puts,scanf,printf 等;数学函数库(cmath):abs,fabs,labs,sin,cos,tan,exp 等;(cstdlib):_max,_
3、min,itoa,atoi,atol,atof,rand等;字符串处理(cstring):strlen,strcpy,strncpy,strcmp,strlwr,strupr,strchr,strrchr,strstr等;字符分类及转换(cctype):isalpha,isdigit,islower,isupper等;动态存储分配(C语言)(malloc.h):calloc,malloc,realloc,free等;时间库函数(ctime):time,ctime,_strtime等;,用户自定义函数:按C+的语法定义函数.,第4章 函数与预处理,函数的定义,定义无参函数的一般格式,第4章 函数
4、与预处理,(void)函数体;return;,注:,如果没有返回值,则为void,return 后面不需要任何返回值,甚至return 本身也可省略.函数体可以是空的,但 不能省.,例:下面的函数用于输出当前时间.,#include void PrnTime(void),char tm11;_strtime(tm);cout tm endl;,定义有参函数的一般格式,第4章 函数与预处理,(形式参数表)函数体;return;,例:求整数m,n的最大公约数.,int gcf(int m,int n)int r;while(r=m%n)!=0)m=n;n=r;return n;,内置函数,第4章
5、函数与预处理,普通函数调用时,需要花费一定的时间.对于一些频繁调用的规模较小、结构较简单的函数,C+提供了一种提高效率的方法,它将被调用的函数代码直接嵌入到调用处,这种函数称为内置函数或内联函数或内嵌函数.,inline int gcf(int m,int n);void main(void)int a,b,c;cin a b;c=gcf(a,b)cout gcf=cendl;,内置函数的概念,内置函数的定义,只要在普通函数的函数头前面加上关键字inline即可,可以加在函数定义处,也可加在声明处,或两处都加.,内置函数的例子,inline int gcf(int m,int n)int r;
6、while(r=m%n)!=0)m=n;n=r;return n;,内置函数(续),第4章 函数与预处理,说明,函数内置只是对编译系统提出的一个建议,最后由编译系统决定是否将函数内置;若内置函数中包含复杂的控制语句,如循环语句,switch语句,则作为普通函数处理.另外,如函数规模较大,也作普通函数处理.,具有函数调用的优点(如,限制局部变量的作用域),且比普通函数的执行速度更快;具有宏定义(稍后介绍)等价的效果,但不象宏定义具有副作用;,增加可执行代码的长度;当内联函数的定义作了修改,则调用内联函数的程序都要重新编译.这对于规模较大、由多个文件组成的程序,比较费时.,内置函数的好处,内置函数
7、的缺点,二.函数的声明、调用和参数传递,第4章 函数与预处理,原型方法,函数的声明,如果在函数的定义前调用该函数,则必须先声明,有两种方法:,函数声明的位置,void main()int gcf(int m,int n);int x,y,t;cin x y;t=gcf(x,y);cout t=t endl;,形式1:函数名(形参类型1,形参类型n);,形式2:函数名(形参类型1 参数名1,形参类型n 参数名n);,放在调用函数的函数体头部,函数声明的位置(续),第4章 函数与预处理,可在声明之后的整个文件中调用函数gcf.,#include head1void main(void),放在文件的
8、头部,int gcf(int m,int n);void main(void)int x,y,t;cin x y;t=gcf(x,y);cout t=t endl;,void f1(int a,in b)int z;z=gcf(a,b);,放在头文件中,习惯上,main函数总是写在程序的最前面,这样程序比较容易阅读.函数声明采用头文件包含到当前程序中,如 head1,head1 文件的内容:,int gcf(int m,int n);,实际上,标准库函数的声明就用这种方式,如sin等函数在cmath文件中定义,因此要用:,#include,函数的调用,第4章 函数与预处理,函数调用的一般格式:
9、,函数名(实际参数列表),如:printf(%dn,x);,t=gcf(x,y);,函数调用方式:,单独的语句,PrnTime();,表达式的一部分,z=3.5*sin(x);,作为函数的实参,#include using namespace std;int max(int a,int b)return ab?a:b;,void main()int x,y,z;cin x y z;coutMax=max(max(x,y),z);,#include using namespace std;int gcf(int m,int n);/函数声明void main(void)int x,y,t;cou
10、tx y;/函数调用t=gcf(x,y);cout gcf=t endl;,函数调用的例子,第4章 函数与预处理,例4.1,/函数定义int gcf(int m,int n)int r;while(r=m%n)!=0)m=n;n=r;return n;,运行程序,函数的参数,形参与实参,参数传递的几点规定:,形参是虚拟的,在函数被调用之前,它并不占用内存.当函数被调用时,系统为形参分配内存,将实参的值传递给形参.以gcf()函数为例,传递过程如右图.,第4章 函数与预处理,若形参是普通变量(包括指针变量),则实参可以是常量、变量或表达式;,实参的形式,若形参是引用型变量,则实参必须是左值量.,
11、实参与形参的顺序必须保持一致,实参数目一般与形参数目相同,但如果带有默认参数,则实参数目可以少于形参数目.对应参数的类型最好一致,如果实参与形参的类型不一致,则按赋值规则自动将实参类型转换成形参类型.,参数传递的几点规定(续),第4章 函数与预处理,例4.2 采用下面的方法来交换两个变量的值是做不到的!,参数传递采用“值传递”方式.如果形参是普通变量,则将实参的值复制到形参;如果形参是指针变量,则将实参的值(地址)复制到形参;如果形参是引用变量,则将形参看作实参,不再为形参分配内存.,void swap(int m,int n)int t;t=m;m=n;n=t;,#include using
12、 namespace std;void swap(int m,int n);void main(void)int x,y;coutx y;swap(x,y);coutx=x,;couty=yendl;,如果输入:1 3则输出为:x=1,y=3,运行程序,函数的默认参数,什么是默认参数,如果在声明或定义函数时,给形参指定一个值,在调用函数时,如果该形参对应的实参空缺,就采用该指定值,这种参数称为默认参数.,第4章 函数与预处理,默认参数的例子,#include using namespace std;floatsum(float a,float b,float c,int iFlag=0)ret
13、urn a+b+c+5.0*iFlag;void main(void)float x,y,z,s;coutx y z;s=sum(x,y,z);/普通考生/s=sum(x,y,z,1);/1-类考生coutsum=sendl;,例4.3 计算考生三门课程的总分.如果是类考生,加附加分5分;若是类考生,加附加分10分;其他考生不加分.,默认值可包含常量、静态或外部变量,或对其它函数的调用;可以在函数原型声明或函数定义时规定默认值,但两者只能取其一,且必须在调用函数之前指定;只有函数最右边的参数才能默认;如,下面的用法是不对的:void setv(int a,int v1=0,int v2);,默
14、认参数的规则,运行程序,函数的嵌套调用,函数不能嵌套定义,但可以嵌套调用,如下例.,例4.4 用二分法求方程 2x3-4x2+3x-6=0 在-10,10之间的根.,#include#include#include using namespace std;doubleroot(double a,double b,double er,double ev);double f(double x);void main(void)double a=-10,b=10,er=1.e-4,ev=1.e-6,r;if(f(a)*f(b)0.0)cout No root at all!endl;elser=roo
15、t(a,b,er,ev);cout setiosflags(ios:fixed)setprecision(4);,第4章 函数与预处理,例4.4(续),double root(double a,double b,double er,double ev)double fa,fc,c;fa=f(a);doc=0.5*(a+b);fc=f(c);if(fabs(fc)0.0)a=c;elseb=c;while(fabs(b-a)=er);c=0.5*(a+b);return c;double f(float x)return(2*x-4)*x+3.)*x-6.0;,运行程序,cout Root:r
16、endl;,第4章 函数与预处理,三.函数的重载与函数模板,函数的重载,函数重载的概念,通常,函数名总是与实际意义相符合,这样可以顾名思义.如,求两个数的最大值,可定义为max.,第4章 函数与预处理,在C语言中,在同一个作用域中函数名不能重复,这样,求两个int型量的最大值与两个double型量的最大值,必须定义成不同的函数.,C+允许在同一个作用域中,有多个同名的函数,这就是函数重载.这些同名的函数称为重载函数族.,重载可用于一般函数,也可以用于类成员函数,还可以用于运算符,如,等.,重载函数的参数个数或参数类型不能完全一致,这样,编译系统可以根据实参的数目与类型调用与之相匹配的函数.,注
17、.,重载函数举例,#include using namespace std;int add(int,int);int add(int,int,int);double add(double,double);,第4章 函数与预处理,例4.5 求几个数的总和并返回.,void main(void)int a,b,c,d;double x,y,z;cout ab c;d=add(a,b,c);cout xy;z=add(x,y);coutx+y=zendl;,int add(int a,int b)return a+b;,double add(double a,double b)return a+b;
18、,int add(int a,int b,int c)return a+b+c;,若输入:1 3 511 22,则输出:1+3+5=91+3=411+22=33,运行程序,注.若定义了函数:int add(int,int,int=0);则不能再定义:int add(int,int);,函数模板,第4章 函数与预处理,函数模板的概念,对于函数体代码相同,参数个数相同,但返回类型不同,参数类型不同的函数,C+允许定义一个虚拟的函数来统一实现函数的代码.这就是函数模板.在调用函数时,编译系统会根据实参及返回值的类型自动生成相应的函数.,定义函数模板的一般格式,template 普通函数的定义,固定写
19、法,template 普通函数的定义,或者,说明,typename和class两个用法等价,现在前者用得较多;调用模板的函数与模板函数必须在同一文件中;定义模板函数后,不能再定义与其重复的函数.,模板函数举例,#include using namespace std;template T1 add(T1 a,T2 b);/函数声明void main(void)int a,b,c;double x,y,z;couta b;c=add(a,b);coutx y;z=add(x,y);cout T1 add(T1 a,T2 b)return a+b;,第4章 函数与预处理,例4.6 求两个不同类型的
20、数之和并返回.,若输入:5 202.5 3.2,则输出:5+20=252.5+3.2=5.75+2.5=7,运行程序,四.函数的递归调用,一个函数直接或间接调用自身,称为递归调用.这样的函数称为递归函数(Recursive function).,递归的两种形式,直接递归:在函数f()的函数体中直接调用f()自身.,递归的特点:递归是函数的循环调用,因此必须要有结束条件;另外,递归要占用较多的堆栈空间来存放函数的参数.,例4.7:求n!,float factorial(int n)float f=1.0;int i;for(i=2;i=n;i+)f*=i;return f;,第4章 函数与预处理
21、,方法一.递推法,方法二.递归法,float factorial(int n)if(n=1)return 1.0;/递归结束条件elsereturn n*factorial(n-1);,由 n!=n*(n-1)!方法来计算,已知n=1时,n!=1.,运行程序,递归函数的执行过程剖析,递归函数的执行分“回推”和“递推”两个阶段.以5!为例,执行过程如下:,回推过程中的实参5,4,3,2,1 被存放在堆栈(stack)内.,递推时将实参1,2,3,4,5依次从堆栈内释放.,第4章 函数与预处理,递归是对自身函数的反复调用,可能会引起重复计算,另外会消耗大量的堆栈空间.因此,如果能较方便地转换成递推
22、算法,通常按递推算法编写程序.,关于递归函数的建议,递归函数实例,方法:仍采用辗转相除法.,#include using namespace std;int gcf(int m,int n);void main(void)int m,n,k;coutm n;k=gcf(m,n);cout The Greatest Common Factor of m and n;cout is:k endl;,说明:,第4章 函数与预处理,例4.8 用递归法求两个整数的最大公因子.,int gcf(int m,int n)cout m,n endl;if(n=0)return m;elseint r=m%n;
23、return gcf(n,r);,每次递归调用时,局部变量m,n,r属于不同的函数,相互独立;在递归调用后,不再执行其它语句,称为末尾递归,很容易改成非递归形式.,运行程序,可以看到每次递归时局部变量的变化.,递归函数实例(续),如图,将A针上的盘借助B针搬到C针上.要求大盘不能压在小盘上.,第4章 函数与预处理,例4.9 Hanoi塔,分析:如果不用递归算法,几乎无法判断该如何移动盘子.采用递归思路:设盘子数目为n,则可以分三步完成.,将上面n-1个盘子从A针借助C针移到B针;将最后一个盘子从AC;将n-1个盘子从B针借助A针移到C针.,例4.9 Hanoi 塔(程序),#include u
24、sing namespace std;void hanoi(int n,char a,char b,char c);void main(void)int n;do cout n;while(n 15);hanoi(n,A,B,C);cout endl;,第4章 函数与预处理,/Hanoi disk:/n disk from a to c with help of b.void hanoi(int n,char a,char b,char c)if(n=1)cout c t;hanoi(n-1,b,a,c);,运行程序,第4章 练习-1,第4章 函数与预处理,4-6题.牛顿切线法的迭代公式为:,
25、从初值x0=1.0出发开始迭代,收敛精度为10-6.,五.作用域与存储类,定义:一个对象(数据或函数)的有效作用范围称为它的作用域.,作用域,是指在函数体(包括main函数)内或复合语句内定义的变量以及函数的形参.其作用域仅限于函数体或复合语句内.这样,不同作用域内的变量或函数可以同名.如下例:,void main(void)int i,a10;double x;for(i=0;i10;i+)int t;.,void func1(int a)int i;float x,y;.,这里a,i,x与main中变量同名,但占用不同内存空间.,第4章 函数与预处理,根据作用域的不同,变量和函数可作如下分
26、类.,局部变量,全局变量,int p=10;int f1(int x)int i,p;p=5;.char c;int f2(int a)int i,k;.i=p+k;.void main()int m,n;.p=f1(m);,在函数之外定义的变量称为全局变量.其自动作用域从定义位置开始到当前文件的末尾.如下例:,说明:,第4章 函数与预处理,全局变量增加了数据联系的渠道,加快了联系速度;全局变量降低了程序的可读性和独立性;全局变量如未赋初值,则在编译时自动置为0(数值型)或空(字符型).全局变量习惯上放在文件头部,当变量数比较多时,可放在头文件中,用#include 包含到文件中.,局部变量与
27、全局变量同名:运算符,第4章 函数与预处理,在C语言中,如果局部变量与全局变量同名且作用域出现重叠,则全局变量会被局部变量屏蔽掉.C+提供作用域运算符:来访问全局变量.请看下例:,#include using namespace std;int p=10;void main(void)float p=3.5;cout p endl;cout:p endl;,说明,:运算符只能用来访问全局变量,不能用于访问局部变量;:运算符还可用于访问类成员变量、函数和类的静态成员变量;,存储类auto,static,extern,register,作用域(可见性):指数据是否可以被访问.在作用域内数据是可访问
28、的,在作用域之外的数据是不可访问的,即使它是存在的.,在变量所在的代码段运行期间分配内存,代码段运行结束后被释放.,数据具有两个属性:作用域和存储期.,存储期(存在性):在程序运行的某个阶段,数据是否存储在内存中,也称为生命期.,从存储期的角度看,变量可分为动态、静态两类.数据在内存中的存放也是这样区分的.,实例:函数的形参,函数内定义的变量,复合语句内定义的变量.,定义方式:用auto存储类说明,如:auto int a;对局部变量,auto是缺省存储类,因此,可省略.,自动变量的存在性和可访问性是一致的.,第4章 函数与预处理,动态(自动)变量,静态变量,第4章 函数与预处理,在程序运行过
29、程中始终存在.在编译阶段分配内存地址(位于静态数据区).如果未赋初值,系统自动置为0(包括0,NULL,).分两种:静态局部变量、静态全局变量;,例4.10 生成01之间的伪随机数.,定义方式:用static存储类说明,如:static int b;,局部静态变量:在函数内部定义的静态变量,#include#include using namespace std;float Prand(void);void main(void)int i,n=10;for(i=0;in;i+)cout Prand()t;cout endl;,运行程序,float Prand(void)long c1=29,c
30、2=217,c3=1024;static long seed=0;seed=seed*c1+time(NULL)%c3*c2;seed%=c3;return(float)seed/c3;,变量seed的作用域仅限于Prand()函数,但它在程序运行过程中始终存在,因此,存在性与可见性是不一致的.每次调用Prand()时,seed的值都不同,因此,返回值也不同.,静态变量(续),第4章 函数与预处理,静态全局变量:在函数外部定义的静态变量,如果将全局变量定义成static型,则它的作用域仅限于所在的文件.与其它文件中的同名变量不会干扰.缺省情况下,全局变量可以被扩展到其它文件.(比较下面的ext
31、ern型变量).,static int p=10;int f1(int x).void main(void).,文件 file1.cpp,文件file2.cpp,extern int p;int f2(int a)p=.;,变量p只在file1.cpp中有效.,变量p虽然用了exrern,但它与file1.cpp中的p毫无关系.p只可能是其它文件中定义的全局变量,否则连接时会出现错误.,寄存器变量,第4章 函数与预处理,存放于寄存器中的变量.寄存器是CPU中的存储设备,是所有存储设备中速度最快的;,register char c;register int i;,由于寄存器数量非常有限,即使定义
32、了寄存器变量,也只有当寄存器有空闲时,才会真正分配到寄存器中.,定义方式:用register存储类说明,如:,说明,只有局部变量和函数形参可声明为寄存器变量;,目前一些编译系统具有自动优化功能,将频繁使用的变量分配到寄存器中,即使没有用register声明.,外部全局变量,第4章 函数与预处理,在同一文件中扩展作用域,通常,全局变量的作用域从定义处到文件末尾,如要扩展其作用域,需用extern声明.有两种扩展方式:,在不同文件中扩展作用域,int f1(int x)extern int p;.int f2(int a).int p=10;void main().,int p=10;int f1
33、(int x).void main().,文件 file1.cpp,文件file2.cpp,extern int p;int f2(int a)p=.;,对象(变量、函数)定义与声明的区别,定义:在一个程序(包括有多个源文件)中只能出现一次.,声明:在需要引用未知的标识符(变量、数组、函数等)时,告诉编译系统该标识符已在其它地方定义.,int f1(int,int);/declareint a=10;/define.int f2(char c)/define.,extern int a;/declarechar c;/defineint f1(char c)/definefloat x;/de
34、fine.,例.,对于变量:应包括数据类型、存储类型、数组的界、初值等内容.对于定义的变量,系统将为其分配内存;对于函数:应包括返回类型、形参表、函数体;,对于变量:包括它的数据类型、存储类型(extern),对于数组,可不写明第一维的长度;对于函数:只需说明返回类型和形参类型,形参名称可不给出.函数的声明以;结束.,第4章 函数与预处理,内部函数和外部函数,举例说明,内部函数,static int func1().int func2().,File1.cpp 文件,File2.cpp 文件,extern int func2();extern int func1();void main().f
35、unc2();/OKfunc1();/不允许.,一个函数如果允许在定义它的文件以外的文件中被调用,称为外部函数.用extern类型声明,这是缺省形式;,第4章 函数与预处理,一个函数如果只允许在定义它的文件中被调用,称为内部函数.用static类型声明或定义;,外部函数,六.预处理命令,第4章 函数与预处理,预处理是指在正式编译前对源代码进行处理,生成新的源代码(临时文件)供编译程序使用.预处理命令由ANSI C/C+统一规定,都以“#”开头,而且独占一行.但它本身不是C语言的组成部分,不能直接进行编译.,什么是预处理命令?,C+提供的预处理命令主要有以下三种:,宏定义;文件包含;条件编译.,
36、宏定义(define),不带参数的宏定义,第4章 函数与预处理,#define,#define PI 3.1415926#define HALFPI(0.5*PI),格式:,在预处理时,将源程序中的“宏名”全部替换成.这一过程称为宏展开.,意义:,这里的称为“宏名”,习惯上用大写字母,以区别于变量;不必用“”括起来.,例,宏展开可能要进行多遍,直到所有的宏名被替换为止.,不带参数的宏定义(续),从定义开始,直到下一个#undef 为止,如没有#undef 预处理命令,则直到文件末尾,不能跨文件使用.,宏定义不是C语句,因此,不必用“;”结尾;如一行写不下,可换行写,要求在未结束行的末尾用“”结
37、束,下一行继续写;中有时需要一些附加的(),确保优先级.如,#define c a+b 若在源程序中有:c*c,宏展开为:a+b*a+b 所以,应改为:#define c(a+b)最好改为:#define c(a)+(b),如,#define _DEBUG主要用于条件编译(后面介绍).,第4章 函数与预处理,几点说明,宏名的作用域,不带的宏定义,带参数的宏定义,第4章 函数与预处理,与函数调用之间的区别,格式:,注意:,例.求最大、最小值的宏定义max 和 min,#define(形式参数表),#define max(a,b)(a)(b)?(a):(b)#define min(a,b)(a)(
38、b)?(a):(b),在与(参数表)之间不能有空格.增加必要的(),使宏展开时不至于改变原始意义;如果与(参数表)之间不能有空格,若有,就会变成不带参数的宏定义.如上例,#define max(a,b)(a)(b)?(a):(b),宏展开是在编译之前进行的,函数调用是在程序运行时进行的;函数调用时,先计算实参的值,再传递给形参;而调用宏定义时,只作宏展开,不进行实参计算;宏定义会增加源代码的长度,函数调用不会;函数调用要求形参与实参之间的类型匹配,宏定义则不要求.,宏定义的调用与展开,第4章 函数与预处理,调用:,无参数格式:在宏名的有效范围内,作为符号常量使用;,带参数格式:类似函数调用的格
39、式,用实参代替形参.如,z=max(x+2,y);调用时,与(参数)之间可以有空格.,宏展开:,通过多次扫描,将程序中的宏名用代替,如果带有参数,则用实参代替形参;,宏展开不作语法检查,只作替换.由于宏定义不当,将引起编译错误.如,#define PI 3.14l5926 调用,s=PI*r*r;/编译时将出现语法错误!凡在字符串 之中与相同的符号不作宏替换;,例如.z=max(x+2,y);展开成:z=(x+2)(y)?(x+2):(y);,注意:,宏定义中#与#的特殊作用,第4章 函数与预处理,:,在执行一次宏替换后,“#”符号被删除.,#define PRT(s,t)printf(y#s
40、=%d,y#t=%dn,y#s,y#t)调用:PRT(1,2);经一次宏展开,替换成:printf(y1=%d,y2=%dn,y1,y2);,在带参数的宏定义中,如果在中形参的前面加上#或#,则会起到特殊的作用.,经字符串合并后成为:printf(y1=%d,y2=%dn,y1,y2);,在宏展开时,将替换成“实参”字符串;,:,例:,文件包含(include),第4章 函数与预处理,格式1:#include 文件名格式2:#include 作用:在编译前将指定的文件加到include宏命令处.,习惯用法:,:只在系统指定的include目录下查找包含文件,如找不到,就发出错误信息.在VC+中
41、,可从Tools Options Directories下的include files栏下查看.,格式1与格式2的区别:,通常将一些宏定义、自定义数据类型、函数的声明、全局变量的定义、内置函数的定义等信息放在各个头文件(C+标准库的头文件没有扩展名)中,然后用include宏命令包含到源文件的头部.,文件名:先到用户的当前工作目录下查找包含文件,若找不到,再到系统指定的include目录下查找,如还是找不到,就发出错误信息.,条件编译,第4章 函数与预处理,格式1:#ifdef#else#endif,条件编译类似于if 语句,但这种选择是在编译时进行的,而不是在运行时进行的.,条件编译格式1,
42、当已定义时,编译,否则编译.这里只判断是否已定义,而不管它的是什么.所以可以用宏定义:#define,变化形式:当为空时,可写成:#ifdef#endif,#ifdef _DEBUG couta=aendl;#endif,功能:,例,条件编译格式2,第4章 函数与预处理,格式2:#ifndef#else#endif,当为空时,可写成:#ifndef#endif,功能:,当未定义时,编译,否则编译.,条件编译格式3,格式3:#if#else#endif,当的值为非零时,编译,否则,编译.,功能:,变化形式:,条件编译格式3(续),#if#elif#elif#else#endif,当为空时,可写为:#if#endif,第4章 函数与预处理,变化形式:,#define PRINT 1#if PRINT couta=aendl;#endif,例:,多重判断,第4章 练习-2,第4章 函数与预处理,