《chap函数与宏定义实用教案》由会员分享,可在线阅读,更多相关《chap函数与宏定义实用教案(41页珍藏版)》请在金锄头文库上搜索。
1、6.1函数函数(hnsh)概念概念C函数(hnsh)分标准函数(hnsh)(库函数(hnsh)和自定义函数(hnsh)。所有函数都是平行的,相互(xingh)独立不能嵌套定义,函数间可以相互(xingh)调用,但不能调用main()函数。第1页/共40页第一页,共41页。6.1.1函数函数(hnsh)的定义的定义古典形式:古典形式:类型标识符类型标识符函数名函数名(形式参数表形式参数表)形式参数说明形式参数说明(shumng);函数体;函数体;现代简洁形式:现代简洁形式:类型标识符类型标识符函数名函数名(形参说明形参说明(shumng)表表)函数体函数体;第2页/共40页第二页,共41页。例:
2、 intmax(x,y)intx,y;/形式参数说明(shumng)/intz;/ 函 数 体 中 的 说 明(shumng)部分/z=xy?x:y;return(z);这两行可以(ky)写成一行:intmax(intx,inty)例: intmax(intx,inty)intz;/函数(hnsh)体中的说明部分/z=xy?x:y;return(z);第3页/共40页第三页,共41页。函数函数(hnsh)参数和函数参数和函数(hnsh)的值的值1形式参数和实际(shj)参数例例从键盘输入两个数,输出其中较大从键盘输入两个数,输出其中较大(jiod)的一个。的一个。main()inta,b,c;
3、scanf(%d%d,&a,&b);c=max(a,b);/*a,b为实际参数为实际参数*/printf(Maxis%d,c);getch();max(intx,inty)/*x,y为形式参数为形式参数*/intz;z=xy?x:y;return(z);第4页/共40页第四页,共41页。形参变量(binling)在被调用前不占用存储单元;在被调用结束后,形参所占存储单元亦被释放。实参可以是常量、变量(binling)或表达式。必须指定形参类型,且应与实参的类型一致。实参对形参的数据传递是“值传递”。即单向传递,不能逆传。注意注意(zhy):第5页/共40页第五页,共41页。函数的返回值是通过r
4、eturn语句获得的。return语句的后面可以有括号,也可以没有。如:returnz;return(z);return语句的后面可以是变量,也可以是表达式。如:return(xy?x:y);return语句返回值的类型(lixng)应与该函数的类型(lixng)一致。否则以函数类型(lixng)为准。函数类型(lixng)缺省时按整型处理。2函数函数(hnsh)的返回值的返回值第6页/共40页第六页,共41页。若函数中没有return语句,则函数被调用(dioyng)后也会带回不确定的值。为了(wile)明确表示不需要函数返回值,可以用“void”定义函数为“无类型”。此时,不得使用a=f(
5、)之类的赋值语句。凡不需要返回值的函数,一般(ybn)均定义为“void”类型。第7页/共40页第七页,共41页。1函数调用的一般形式函数调用的一般形式函数名函数名(实参表实参表)说明:说明:对于无参函数,也不得省略一对小括号。对于无参函数,也不得省略一对小括号。“实参表实参表”中的参数中的参数(cnsh)之间用逗号分开。之间用逗号分开。实参与形参之间的个数及类型必须一一对应。实参与形参之间的个数及类型必须一一对应。函数函数(hnsh)的调用的调用第8页/共40页第八页,共41页。将函数调用作为一个语句(yj)。如:printf(“MSCpragramming”);gets(s);将被调用的函
6、数写在表达式中。如:c=2max(a,b);注意:被调用函数max必须有确定的返回值。将函数调用作为一个函数的实参。如:m=max(max(a,b),c);2函数调用的方式函数调用的方式(fngsh)第9页/共40页第九页,共41页。3对被调用函数的说明对被调用函数的说明在一个函数中调用另一个函数时:在一个函数中调用另一个函数时:如如果果被被调调函函数数为为库库函函数数,则则应应在在文文件件(wnjin)开开头头用用“#include”命命令令声声明明相相应应的的“头头文件文件(wnjin)”。如:。如:#include“stdio.h”#include“math.h”如果被调函数为自定义函数
7、且其定义在主调函数定义之后,则应在主调函数中对该函数进行声明。其语句形式(xngsh)一般为:类型标识符被调函数名(参数列表);如:floatadd(intx,inty);第10页/共40页第十页,共41页。 如果被调函数为自定义函数且其定义在主调(zhdio)函数定义之前,则在主调(zhdio)函数中可不必声明。如果已在所有函数定义之前已作了函数声明,则在各主调(zhdio)函数中可不必对所调用的函数再作声明。如:charletter(); floatf();inti();main()/不必说明它所调用的函数的类型/第11页/共40页第十一页,共41页。1局部变量局部变量-在一个函数内部定义
8、的变量,只能在本函数内使用(shyng)和有效。主函数main中定义的变量,也只能在主函数内使用(shyng)和有效。不同的函数中可以使用(shyng)相同名字变量,且互不干扰。形式参数也是局部变量,也只能在所在函数内使用(shyng)和有效。可以在一个函数内的复合语句中定义变量,且这些变量只在本复合语句中有效。这种复合语句也称为“分程序”或“子模块”。局部变量和全局变量局部变量和全局变量6.2变量的作用域和存储(cnch)类型第12页/共40页第十二页,共41页。2全局变量全局变量全全局局变变量量(外外部部变变量量)-在在函函数数(hnsh)(包包括括main函函数数(hnsh)外外定定义义
9、的的变变量量。其其有有效效范范围围为为从从定定义义变变量量的的位位置开始到本源文件结束。置开始到本源文件结束。在文件开头定义的外部变量才可在整个文件范围内使用,若在定义点之前的函数需引用外部变量,则可用关键字“extern”作“外部变量声明”。注意:外部变量的定义只能有一次,它的位置在所有函数之外。而同一程序中的外部变量声明可以(ky)有多次,它的位置在函数之内(哪个函数要用就在哪个函数中说明)。系统根据外部变量的定义(而不是根据外部变量的说明)分配存储单元。对外部变量的初始化只能在“定义”时进行,“extern”只是申明该变量是一个已在外部定义过的变量而已。如果在同一源文件中,外部变量与局部
10、变量同名,则在局部变量的作用范围内,外部变量不起作用。第13页/共40页第十三页,共41页。输出输出(shch)结结果:果:10,4,810,2,5例例#includestdio.hmain()inta=1,b=2,c=3;a+;c+=b;intb=4,c;c=2*b;a+=c;printf(%d,%d,%dn,a,b,c);printf(%d,%d,%dn,a,b,c);getch();第14页/共40页第十四页,共41页。内内存存中中供供用用户户使使用用的的存存储储区区由由程程序序区区、静静态态存存储储区区和和动态存储区组成。动态存储区组成。变量的存储类型有四种:变量的存储类型有四种:自动
11、的自动的(auto):内存的动态存储区:内存的动态存储区静态的静态的(static):静态存储区:静态存储区寄存器的寄存器的(register):寄存器:寄存器静静态态变变量量在在程程序序的的运运行行期期间间占占用用固固定定的的存存储储空空间间,直直到到程序的终止而释放程序的终止而释放(shfng);动动态态变变量量是是在在程程序序的的运运行行期期间间随随着着函函数数的的调调用用随随时时动动态态地占用和释放地占用和释放(shfng)存储空间。存储空间。变量的存储变量的存储(cnch)类型类型第15页/共40页第十五页,共41页。局部变量的存储方式局部变量的存储方式(fngsh)函函数数中中的的
12、局局部部变变量量若若未未专专门门说说明明,这这类类局局部部变变量量称称为为自自动动变变量量,其其类类型型说说明明前前不不论论是是否否有有关关键键字字“auto”,都属于动态存储类别。都属于动态存储类别。2)若希望(xwng)被调函数在结束后,其局部变量占用的存储空间不释放,以便保留其变量的值,用于下次调用该函数,则用“static”说明为“局部静态变量”。第16页/共40页第十六页,共41页。局部静态变量在 静 态 存 储 区 分 配 存 储 单 元 , 在 程 序 的 整 个 运 行(ynxng)期间都不释放。在编译时只赋初值一次,以后每次被调用时不再重新赋值而只保留前次被调用结束时的值。若
13、未赋初值,则在编译时自动赋初值0(数值型)或空字符(字符型)。虽然局部静态变量在函数被调用结束后其值仍然存在,但其它函数是不能引用的。动态变量在动态存储区分配存储单元,函数调用结束后即释放。赋初值不是在编译时而是在函数被调用时进行的,函数每次被调用时重新赋值。若未赋初值,则其值是不确定的第17页/共40页第十七页,共41页。例例打印打印1到到5的阶乘值。的阶乘值。intfac(intn)staticintf=1;/定义定义f为为int型静态型静态(jngti)变量变量/f=fn;return(f);main()inti;for(i=1;i1f(0)=1,f(1)=1第23页/共40页第二十三页
14、,共41页。longfac(intn)longresult;if(n=0|n=1)result=1;elseresult=n*fac(n-1);returnresult;main()intn;longf;printf(Pleaseentervalueofn:n);scanf(%d,&n);if(n(c+d)?(a+b):(c+d)如如果果第第一一行行写写成成:#defineMAX(x,y)xy?x:y则则这里这里(zhl)的的t展开后为展开后为t=a+bc+d?a+b:c+d因因为为置置换换展展开开是是用用“表表达达式式”对对等等的的置置换换“形形参参表表”中中的参数。的参数。定义带参数(cn
15、sh)的宏,可以实现一些简单的函数功能。如:如: #defineMAX(x,y)(x)(y)?(x):(y)main()inta,b,c,t;t=MAX(a+b,c+d);第30页/共40页第三十页,共41页。6.5.2“文件文件(wnjin)包含包含”用#include命令实现一个文件包含(bohn)另一个文件。语句形式:#include“文件名”例例#includestdio.h#defineN2#defineMN+1#defineNUM(M+1)*M/2main()inti,n=0;for(i=1;i=NUM;i+)n+;printf(%2d,n);getch();输出输出(shch)结
16、果:结果:12345678第31页/共40页第三十一页,共41页。一个include命令只能(zhnn)指定一个被包含文件,如果要包含n个文件,则要用n个include命令。NUM被代换(dihun)展开后为:(2+1+1)2+1/2#include命令中,文件名既可用双引命令中,文件名既可用双引“”号号(推荐),也推荐),也可用尖括号可用尖括号括起来。括起来。表示被包含在标准目录中表示被包含在标准目录中(include).“”表示被包含文件在指定表示被包含文件在指定(zhdng)目录中,若目录中,若只有文件名不带路径,则在当前目录中,若找不到,再只有文件名不带路径,则在当前目录中,若找不到,
17、再到标准目录中找。到标准目录中找。包含文件名可以是包含文件名可以是.c源文件或源文件或.头文件,如头文件,如#include#include“myhead.h”#include“D:myexammyfile.c”第32页/共40页第三十二页,共41页。6.12条件编译条件编译语句形式:语句形式:1#ifdef宏名宏名程序段程序段1#else程序段程序段2#endif作用:如果作用:如果(rgu)宏名已定义,则编译宏名已定义,则编译“程序段程序段1”,否则编译,否则编译“程序段程序段2”。所谓“宏名已定义”是无论“宏名”定义为什么内容。条件编译的作用:缩短编译时间(shjin),减少目标程序的长
18、度。第33页/共40页第三十三页,共41页。作用:如果(rgu)宏名未定义,则编译“程序段1”,否则编译“程序段2”。3#if表达式程序段1#else程序段2#endif作用:当“表达式”值为非0,则编译“程序段1”,否则编译“程序段2”。2#ifndef宏名程序段1#else程序段2#endif第34页/共40页第三十四页,共41页。4#if表达式1程序段1#elif表达式2程序段2#else程序段3#endif作用:当“表达式1”值为非0,则编译“程序段1”,否则(fuz)判断”表达式2”;当“表达式2”的值为真,则编译“程序段2”,否则(fuz)编译”程序段3”。第35页/共40页第三十
19、五页,共41页。例例#defineTED10main()#ifdefTEDprintf(Hi,Tedn);#elseprintf(HI,Anyonen);#endif#ifndefPALPHprintf(RAPLHnotdefinedn);#endifgetch();第36页/共40页第三十六页,共41页。例main()#ifMAX99printf(compileforarraygreaterthan99);#elseprintf(compileforsmallarray);#endifgetch();第37页/共40页第三十七页,共41页。例例#defineN2#defineMN+1#def
20、ineNUM2*M+1main()inti;for(i=1;i(y)?(x):(y)main()inta=5,b=2,c=3,d=3,t;t=MAX(a+b,c+d)*10;printf(%dn,t);/*t的值是多少的值是多少(dusho)?*/getch();第38页/共40页第三十八页,共41页。作业作业(zuy):6.41第39页/共40页第三十九页,共41页。感谢您的观看(gunkn)!第40页/共40页第四十页,共41页。内容(nirng)总结6.1 函数(hnsh)概念。在被调用结束后,形参所占存储单元亦被释放。 必须指定形参类型,且应与实参的类型一致。 实参对形参的数据传递是“值传递”。形式参数也是局部变量,也只能在所在函数(hnsh)内使用和有效。静态的(static) :静态存储区。1)问题的后一部分与原始问题类似。通常,宏定义命令一般写在文件开头或函数(hnsh)之前作为该文件的一部分。包含文件名可以是.c源文件或.头文件,如。感谢您的观看第四十一页,共41页。