您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第七章 库函数函数的定义与返回值
第七章函数在解决一个比较复杂的实际问题时,不可能把所有要完成的任务全都写在main函数中。这时,程序往往由一个main函数和若干个其它函数组成,每个函数各自完成相对独立的部分功能。在前面的章节中,我们编写的程序都是由一个main函数来组成,在main函数中调用过scanf、printf等系统函数。模块化的程序设计方法函数间相互调用的示意main()f1()f11(){{{┇┇┇f1();f11();}┇┇f12()f2();f12();{┇┇┇}}}f2()f21(){{┇┇f21();}┇}函数的分类从函数形式无参函数有参函数?我们学习过哪些无参函数和有参函数?从用户角度标准函数(库函数):由系统提供用户自定义函数库函数由系统提供,用户只要按照要求的格式正确调用即可。不同的C编译系统提供的库函数有些不同。§7.1库函数使用库函数应注意的问题:1、调用库函数时要用#include命令将相关的头文件包含进来。如:调用数学函数,用#includemath.h|math.h调用输入输出函数,用#includestdio.h|stdio.h调用字符函数,用#includectype.h|ctype.h2、库函数调用的一般形式:函数名(参数表)要注意函数的功能、参数的个数与类型、函数值的类型。如:求平方根的函数sqrt的形式是:doublesqrt(doublex)3、库函数调用以两种方式出现。其一:出现在表达式中,即作为表达式的一部分参与运算。如:计算y=x2.5+1.3,则通过以下语句调用来实现。y=pow(x,2.5)+1.3;其二:独立的语句,即调用函数后加一分号。如:printf(*****\n);4、调用库函数时,要注意参数的一些特殊要求。如三角函数要求自变量参数用弧度表示,开平方函数要求自变量参数的值大于或等于0。使用库函数应注意的问题(续)函数返回值的类型缺省int型无返回值:void函数体函数类型函数名(形参类型说明表){说明部分执行部分}§7.2函数的定义和返回值1.函数定义的一般格式现代风格:多个形参说明之间要用逗号隔开没有形参时,这一对括号不能省略合法标识符如果函数的类型不是void,函数体最后要用return语句去返回一个值.例1有参函数(现代风格)intmax(intx,inty){intz;z=xy?x:y;return(z);}例2有参函数(现代风格)intmax(intx,y){intz;z=xy?x:y;return(z);}例3无参函数voidprintstar(){printf(**********\n);}或voidprintstar(void){printf(**********\n);}函数的定义示例例4空函数voiddummy(void){}函数体为空(留待以后补充)intmax2(intx,inty)/*现代风格*/{intmax;if(xy)max=x;elsemax=y;printf(max(max2)=%d\n,max);return(max);}voidmain(){inta,b,max;scanf(%d,%d,&a,&b);max=max2(a,b)+100;printf(max(main)=%d\n,max);}例函数的定义形参和函数体中定义的变量只在函数被调用时才临时分配存储单元,当退出函数时,这些存储单元全部被释放(称为局部性,因而与其它函数中的变量同名不会引起混淆)。main()时,main函数是什么类型的?可改写为max=xy?x:y;形参实参函数与函数之间是平等的voidmain(){intmax2(intx,inty){intz;if(xy)z=x;elsez=y;return(z);}inta,b,max;scanf(%d,%d,&a,&b);max=max2(a,b);printf(max=%d\n,max);}函数的定义是平行的,不能在一个函数的内部再定义其它函数。即每个函数都是一个相对独立的模块,不能在写某一个函数时又包含了另一个函数的定义(main函数的执行时有一点点小的特权!)。返回语句形式return(表达式);或return表达式;或return;功能:使程序控制从被调用函数返回到调用函数中,同时把返值带给调用函数说明:函数中可以有多个return语句,但只有其中的一个return语句能够得到执行若函数中没有return语句,或者是一个不带表达式的return语句,则该函数结束时自动返回调用函数一个不确定的值若函数类型与return语句中表达式值的类型不一致,按前者为准,自动转换------函数调用转换void型函数:明确说明函数没有返回值2.函数的返回值intmax(floatx,floaty){floatz;z=xy?x:y;return(z);}main(){floata,b;scanf(%f,%f,&a,&b);printf(Maxis%d\n,max(a,b));}例函数返回值类型转换main(){inta,b,max;scanf(%d,%d,&a,&b);max=max2(a,b);printf(max=%d\n,max);}intmax2(intx,inty){intz;if(xy)returnx;elsereturny;}例函数可以有多个return语句注意:在C语言中,函数名不能被赋值,只能通过return语句返回一个值。intmax2(intx,inty){max2=xy?x:y;}printstar(){printf(*********\n);}main(){inta;a=printstar();printf(a=%d\n,a);}输出:a=10例函数带回不确定值printstar()是什么类型?void型函数:明确说明函数没有返回值#includestdio.h/*void*/printstar(){printf(*****@@@##****\n);}main(){inta;a=printstar();a=printstar();printf(a=%d\n,a);}voidprintstar(){printf(*********\n);}main(){inta;a=printstar();printf(a=%d,a);}编译错误!(VC++)errorC2120:'void'illegalwithalltypes说明:(1)调用函数时,其名字必须与定义的名字相同。(2)函数调用时的实参只写名字不需要在名字前再带实参类型。如上面main函数中对max2函数的调用不能写成:max=max2(inta,intb);§7.3函数的调用1.函数调用的一般形式:函数名(实参表);说明:(3)实参与形参,个数应一致。若实参少,则必有形参未得到值(不确定值),影响结果。若实参多,则多余的无效(TC)。如:c=max2(3);则c的值为:761(随机值)若:c=max2(3,5,8);则c的值为:5(4)实参与形参的类型应一一对应相匹配。若不匹配,程序仍能运行,但得不出正确结果(TC)。如:c=max(3.0,5.0);则c的值为:0若:c=max(3L,5L);则c的值为:3函数调用说明(续)(5)函数必须先定义,后调用。将要被调用的函数定义在前,调用在后。返回值类型为int或char的函数可例外。(6)函数可直接或间接地自己调用自己(递归调用,在7.6节介绍)函数调用说明(续)(7)实参表求值顺序,因系统而定(TurboC自右向左)#includestdio.hvoidmain(){intp=2;printf(%d,%d,%d\n,p,++p,p);}/*TC:3,3,2VC:3,3,2*/#includestdio.hvoidmain(){intp=2;printf(%d,%d,%d\n,p,p++,p);}/*TC:3,2,2VC:2,2,2*/P192.函数调用的方式1.函数表达式:例m=max(a,b)*2;2.函数语句:例printstar();printf(Hello,World!\n);3.函数参数:例printf(%d,max(a,b));m=max(a,max(b,c));§7.4函数的说明在C语言中,除了主函数外,对于用户定义的函数要遵循“先定义,后使用”的规则。凡是未在调用之前定义的函数,C编译程序默认函数的返回值为int类型。对于返回值为其它类型的函数,若把函数的定义放在调用之后,应该在调用之前对函数进行说明(或称为函数原型说明)。C语言对被调用函数要求:必须是已存在的函数库函数:#include*.h用户自定义函数:函数类型说明1.函数说明一般形式函数类型函数名(形参类型[形参名],…..);函数类型函数名();或main(){floata,b,c;floatmax2(floatx,floaty);/*函数的说明*/scanf(%f%f,&a,&b);c=max2(a,b);/*函数的调用*/printf(%f\n,c);}floatmax2(floatx,floaty)/*以下为函数的定义*/{floatz;if(xy)z=x;elsez=y;return(y);}例如:函数说明语句作用:告诉编译系统max2函数是float类型的、有2个float类型的参数。可选在VC中不允许说明(1)函数说明可以是一个独立的语句;如上面例子中就是采用独立语句的形式。(2)函数说明中的形参名是一种虚设,它们可以是任意的用户标识符,既不必与函数首部中的形参名一致,又可以与程序中的任意用户标识符同名。因此,参数名也可以省略。如上面的例子中函数说明可写成:floatmax2(float,float);(3)注意函数定义与函数说明是不同的,定义是写出函数的完整形式,而说明是告诉系统此函数的返回值类型、参数的个数与类型,便于编译时进行有效的类型检查。(4)若函数的返回值类型为int或char,则可以不进行函数说明(系统默认)。但是使用这种方法时,系统无法对参数的类型做检查。若调用函数时参数使用不当,在编译时也不会报错。因此,为了程序清晰和安全,建议都进行说明为好。(5)若被调函数的定义出现在主调函数之前,也可以不进行函数说明。(6)有些系统(如BorlandC++、VC++等)要求一定要用函数说明指出函数类型和形参类型,并且对void和int型函数也要进行函数说明。main(){inta,b,c;scanf(“%f%f”,&a,&b);c=max2(a,b);/*函数的调用*/printf(“%f\n”,c);}intmax2(intx,inty)/*以下为函数的定义*/{intz;if(xy)z=x;elsez=y;return(z);/*书错为return(y)*/}int型函数可不作函数说明(BorlandC++不行)floatmax2(floatx,floaty)/*以下为函数的定义*/{floatz;if(xy)z=x;elsez=y;return(z);/*书错为return(y)*/}main(){floata,b,c;scanf(“%f%f”,&a,&b);c=max2(a,b);/*函数的调用*/printf(“%f\n”,c);}被调函数出现在主调函数之前,不必函数说明main(){floatadd(float,float);/*functiondeclaration*/floata,b,c;scanf(%f,%f,&a,&b);c=add(a,b);printf(sumis%f,c);}floatadd(floatx,floaty){floatz;z=x+y;return(z);}也可写成:floatadd();例函数说明举例2.函数说明的位置(1)放在调用函数的说明部分(只有此调用函数能识别被调用函数)。可以是独立语句,也可与其它变量的定义放在同一个语句中。如上面的用法也可以如下形式的语句:floata,b,c,max2(fl
本文标题:第七章 库函数函数的定义与返回值
链接地址:https://www.777doc.com/doc-3807880 .html