




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第四章函数和预处理,函数就是一系列指令或语句的组合体使用目的:适用于大型程序,按功能模块化实现函数对一些重复出现的代码编成函数重用,目录,4.1函数的概述4.2函数的定义和调用4.3函数的参数传递4.4内联函数4.5递归函数4.6函数重载4.7作用域4.8文件与预编译命令,4.1函数概述,当一个程序在调用某个函数时,c+自动转到被调用的函数中执行,执行完后再回到原先程序执行的位置,继续执行下一条语句。,目录,4.2函数定义和调用,函数定义在使用函数时,要先对函数进行定义,确定它要实现的功能。函数调用函数的使用就是调用函数的过程。,4.2.1函数定义,形式如下:()函数体;,函数名是有效c+标识符,其后必须跟(),以区别于变量名及其他用户定义的标识名。,即函数的返回值类型,若不需要函数有返回值,则定义函数的类型为void即可。,各参数以逗号隔开,每个参数由参数类型和参数名表示。参数个数可以为,但圆括号不能省略。,由括起来的若干条语句组成,实现这个函数执行的功能。,注:C+不允许在一个函数体中再定义另一个函数,函数返回值,intmax(intx,inty)return(xy?x:y);/返回整型函数返回值语法return;将return后面的值作为函数返回值,类型同函数定义处的类型相匹配,注意:,若函数类型为void,函数体中就不需要return或者return的后面什么也没有例:无返回值函数voidmax(intx,inty)couty?x:y);/无return一旦执行return语句,函数体return后的语句不再执行例:求负数绝对值intabb(intx)if(x0)returnx;coutxy;coutx和y中较大数为max(x,y)y;cout=y?x:y);,目录,4.3函数的参数传递,参数类型检查C+参数的传递方式:按值传递地址或引用传递,1.按值传递,参数传递的缺省初始化方式是把实参的值拷贝到形参的存储区。函数本身不对实参进行操作,只是处理的实参的本地拷贝。也就是说,即使形参的值在函数中发生了变化,实参的值不会受到影响。,#includevoidswap(intx,inty)inttemp=x;x=y;y=temp;voidmain()inta=2,b=10;swap(a,b);couta=a,b=b;cout引用在声明时必须初始化引用的声明形式:注意:引用仅在说明的时候带/n的内容为1int*p=/p为整型指针变量,其内容是n的地址*p表示p指向的整型变量的值;调用函数时需要指定地址值形式的实参。通过改变形参(指针)指向的变量来影响实参。,存放变量的地址,#includevoidswap(int*x,int*y)inttemp=*x;*x=*y;*y=temp;voidmain()inta=2,b=10;swap(,结果:a=10,b=2,2(*x),10(*y),0 x000E,0 x001E,0 x000Ea,0 x001Eb,x,y,地址,内容,变量名,102,参数传递的总结,值传递引用和地址传递,改变实参副本(拷走),改变实参本身(操作),4函数的默认参数值,C+允许在函数的说明或定义时给一个或多个参数指定默认值。这样在调用时可以不给出参数,而按指定的默认值进行工作。定义voidinitialize(intprintNO,intstate=0)调用initialize(1);/打印机状态缺省为0initialize(1,0);/传递打印机状态参数0initialize(1,1);,函数可以将其全部或部分参数定义为带默认值,但带默认值的参数只能放在参数表的最后例:以下函数定义不正确:voidf(intpar1=1,intpar2,intpar3=3)voidf(intpar1=1,intpar2=2,intpar3)因为系统按从前往后的顺序进行参数匹配若中间参数有默认值,无法判断哪些参数使用默认值f(5);f(3,6);f(2,3,4);,注意:,注意2,函数既有定义又有说明时,一般说明中给出默认形参值。voidinitialize(intprintNO,intstate=0);同一作用域中,函数某一参数的默认值只能说明一次voidinitialize(intprintNO,intstate=0);voidinitialize(intprintNO,intstate=1);/错!在同一全局作用域内重复说明/state默认值voidmain()voidinitialize(intprintNO,intstate=1);/可以!在不同作用域内voidinitialize(intprintNO,intstate),程序还可以通过重新定义函数原型使本来不带默认值的参数带上默认值,这是使通用函数特定化例:以下声明合法:(同一作用域)voidinitialize(intprintNO,intstate=0);voidinitialize(intprintNO=1,intstate);/对!重新定义printNO的默认值,注意3,#includevoidinitialize(intprintNO,intstate=0);voidinitialize(intprintNO=1,intstate);/重新定义printNO的默认值voidmain()initialize();initialize(0);initialize(1,1);voidinitialize(intprintNO,intstate)cout“printNO=”printNO“,”;cout“state”stateendl;,本程序的运行结果如下ptintNO=1,state=0ptintNO=0,state=0ptintNO=1,state=1,函数调用机制,main().调func().,保存:返回地址当前现场,恢复:主调函数现场返回地址,voidfunc().,目录,4.4作用域,作用域(讨论标识符的有效范围)变量的作用域是指程序中变量有效的区域。分为三类:文件域局部域类域。,#includeintglobal;voidf(intpar)intflocal;if(global)intblocal;blocal=par;blocal=1;flocal=1;global=1;voidmain()intlocal=2;f(local);,global/全局变量localparflocalblocal,全局变量全局域定义的变量(定义在所有函数之外的变量)局部变量函数、块中定义的变量,局部变量,global作用域,flocal作用域,blocal作用域,local作用域,注意,同一作用域,不能声明同名的标志符不同作用域的标识符可以重名,但是具有包含关系的作用域中,局部变量会隐藏同名全局变量在没有互相包含关系的作用域中,声明的标志符互不影响具有包含关系的作用域中声明了同名标志符,则外层标志符在内层不可见(局部变量可隐藏同名全局变量),#includeintn=1;/n为全局变量voidFun()intn=10;/n为函数内局部变量cout0)intn=5;/n为块内局部变量,掩盖了全局的ncout“Block:n=”nendl;cout“Main:n=”ngh_ratio;coutzh_ratio;cout工行本月还贷:count(loan,gh_ratio)endl;cout中行本月还贷:ch;/Q或q为结束while(ch!=Q/Q或q为结束,ewelcome!Youare1vwelcome!Youare2q,静态局部变量VS.局部变量,分配空间系统给静态的局部变量分配固定的存储空间(全局存储空间)而不是每次执行到该局部域时才分配空间,所以它能一直保持值。局部变量:每次进入其作用域时才分配空间初始化静态局部变量只在第一次执行时初始化一次,局部变量每次执行到该局部域都需要初始化,静态全局变量,被定义为静态的全局变量只在定义它的文件中可见,其他文件中不能使用。优势信息隐藏在不同的文件中使用意义不同而同名的变量名。,非静态全局变量可以做外部变量,给出以下程序的执行结果:#includeintglobal1=0;/全局变量可以在程序中显式初始化intglobal2;/全局变量也可以由系统隐式初始化为0staticintglobal3=1;/静态全局变量voidmain()inti;/局部临时变量for(i=0;i3;i+)inttemp=l;/局部临时变量,每次循环都会重新初始化staticintperm=l;/静态局部变量,只在第一次初始化cout“temp=”temp“,perm=”permendl;+temp;+perm;,temp=1,perm=1temp=1,perm=2temp=1,perm=3,temp和perm释放空间吗,注意,静态局部变量VS.局部变量静态全局变量VS.全局变量,暂时存在,永久存在,本文件使用,可做外部变量,2.外部变量(extern),定义文件1中的非静态全局变量需要在文件2中引用,对于文件2来说是外部变量。外部变量:externintvar;外部函数:定义在一个文件中的函数也可以由另一个文件引用:externvoidfunc(int,int);,引用前要声明,可以省略,extern声明注意,变量没有extern,报错!函数缺省被认为是外部的,/file1.cpp#includeintgInt;/全局变量隐式初始化为0voidsetgInt(inti)gInt=i;coutinfile1SetgInt:gIntendl;,/file2.cpp/intgInt;错!编译报变量重名错误externintgInt;voidsetgInt(int);/省略extern#includevoidmain()coutinfile2:gInt=gIntendl;setgInt(10);gInt+=4;coutinfile2gInt=gIntendl;,infile2:gInt=0infile1SetgInt:10infile2gInt=14,3.自动变量(auto),声明格式autointn;一般来说,用自动存储类型说明的变量都限制在某个程序范围内使用,即为局部变量。当程序执行到超出该变量的作用域时,就释放他所占用的内存空间,其值也随之消失了。注:若自动存储类型的变量是在函数内或语句块中说明的,则可省略关键字auto。其实,我们在程序中见到的未说明存储类型的变量都是auto变量。,4.寄存器变量(register),声明格式register;例:registerintn;适于频繁使用的变量一般的变量是放在内存里面的若将变量放入寄存器内,会加快了程序的运行速度。,regiser注意,只有局部自动变量和形参可以作为register变量,全局和静态的不可!当今的优化编译系统能识别频繁使用的变量,自动将其放在regiser中,无须人为指定,变量的生命期,变量的生命期小结,种类静态生命期局部生命期动态生命期静态生命期自定义始,至程序结束止才释放存储空间如:全局变量静态全局变量静态局部变量。未被用户初始化的情况下,系统会自动将其初始化为0。,永久,暂时,局部生命期在函数内部或块中定义的标识符具有局部生命期。如果未被初始化,其内容是随机的。注:局部生命期的标识符具有局部作用域;如:静态局部变量,动态生命期(后续内容介绍)具有动态生命期的标识符由特定的函数调用或运算来创建和释放,如调用malloc()或用new运算符为变量分配存储空间时,变量的生命期开始,而调用free()或用delete运算符释放空间或程序结束时,变量生命期结束。具有动态生命期的变量存放在堆区。具有动态期的标识符如果未被初始化,其内容是随机的。(关于new运算和delete运算将在后面章节介绍),目录,4.5内联函数inline,内联是内联扩展(inlineexpansion)的简称。为什么引入内联函数?在编译时,C十十编译器在遇到调用内联函数的地方会用函数体中的代码来替换函数的调用好处:节省函数调用带来的参数传递、运行栈的入栈与出栈等开销,从而提高运行速度代价:增加了代码长度,定义:在一般函数定义前加inline关键字。,inlineintabs(intx)if(x0)returnx;elsereturnx;voidmain()intm,m1=2,n,n1=-10;m=abs(m1);n=abs(n1);,编译程序会自动用函数体代替函数调用voidmain()intm,mt=2,n,n1=-10;/m=abs(m1);转换代码if(m1n;coutf(n);,f(n)=n*f(n-1)=n*(n-1)*f(n-2)=n*(n-1)*2*f(1),例:汉诺塔问题,#includevoidhanio(int,char,char,char);voidmain()charA=A,B=B,C=C;intn=3;hanio(n,A,B,C);voidhanio(intn,charA,charB,charC)if(n=1)cout将第n个盘片从A柱搬到C柱上endl;elsehanio(n-1,A,C,B);cout将第n个盘片从A柱搬到C柱上形参),执行函数体,返回调用点并返回要求的函数返回值,执行流程,#includestructcomplexdoublereal;doubleimaginary;intadd(intx,inty)returnx+y;doubleadd(doublex,doubley)returnx+y;complexadd(complexc1,complexc2)complexc;c.real=c1.real+c2.real;c.imaginary=c1.imaginary+c2.imaginary;returnc;,例:根据实参类型选择函数(两数求和),voidmain()intm=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 物业工程考试题及答案
- 新型环保纺织品的应用前景试题及答案
- 深度复习计划纺织品设计师证书试题及答案
- 广告设计的设计理念与目标 试题及答案
- 事业编往年试题及答案解析
- 深入分析广告设计师职业使命与价值观试题及答案
- 助理广告师用户行为分析试题及答案
- 助理广告师考试市场营销案例试题及答案
- 2024年助理广告师备考内容与学习路径优化试题及答案
- 广告设计与心理营销的结合测试试题及答案
- GB/T 14832-2008标准弹性体材料与液压液体的相容性试验
- 送达地址确认书(诉讼类范本)
- 电机检测报告
- 内镜下逆行阑尾炎治疗术
- SJG 82-2020 政府投资学校建筑室内装修材料空气污染控制标准-高清现行
- 《脂蛋白(a)与心血管疾病风险关系及临床管理的专家科学建议》(2021)要点汇总
- 生物防治第三讲
- 2004年武汉房地产市场情况分析报告(共23页)
- 肿瘤化学治疗
- RMG88.62C2控制器报警显示及可能的故障原因 - 副本
- 学业水平考试复习高中语文文言文课本翻译
评论
0/150
提交评论