函数定义和函数调用.ppt

上传人:牧羊曲112 文档编号:6093653 上传时间:2023-09-23 格式:PPT 页数:46 大小:220.99KB
返回 下载 相关 举报
函数定义和函数调用.ppt_第1页
第1页 / 共46页
函数定义和函数调用.ppt_第2页
第2页 / 共46页
函数定义和函数调用.ppt_第3页
第3页 / 共46页
函数定义和函数调用.ppt_第4页
第4页 / 共46页
函数定义和函数调用.ppt_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《函数定义和函数调用.ppt》由会员分享,可在线阅读,更多相关《函数定义和函数调用.ppt(46页珍藏版)》请在三一办公上搜索。

1、4.2函数的声明和函数调用,1.函数定义和函数调用的区分 1)函数定义:要给出函数名、函数类型、形式参数、函数的实现过程(函数的定义性说明),它是一个完整的、独立的函数单位。,2)函数声明 只给出函数名、函数类型、形参类型(有时给出形参名)。没有给出函数实现的过程描述。有时称为函数原型说明,一般放在程序开头,描述本程序将要用到哪些函数(函数的引用性说明)。,3)设立函数的作用提高程序的可读性(本程序使用到了哪些函数)并且改善程序的结构;减少程序编写、调试的工作量,提高程序设计效率并较好地保障程序的正确性和可靠性;,提供语法检查(在程序中对照函数原型,检查所属实际使用的函数的参数是否和函数原型规

2、定的参数类型想匹配,若不匹配就自动转换为函数原型所规定的类型。C语言无此功能,C才有)。,例子:求用户输入的三个数中的最大者,演示函数的引用性声明。#include float max(float,float);/函数的引用性声明 void main()float i,j,k;/用户输入的三个数 float temp;/临时最大者 coutijk;/找出最大数存放在temp中 temp=max(i,j);temp=max(temp,k);cout=y)z=x;else z=y;return z;,2.函数的定义性说明(函数定义)1)含义:给出函数名、函数类型、形式参数、函数的实现过程(函数的定

3、义性说明)。2)形式如下:类型 函数名(形式参数表)语句序列,3)相关术语 函数名函数类型 函数参数函数参数传递 函数体 函数值的返回控制的转移,函数名为函数所起的名字,必须是一个有效的C标识符(以字母或下划线开头、后接字母或数字或下划线的字符序列),但不允许使用C的保留字作为函数名。,我们应该根据函数所完成的功能为函数起一个有意义的名字。在书写函数名字时应在后面加上一对圆括号以区别于其它变量或类型的名字。,函数类型函数类型是指函数返回值的类型,可以是基本数据类型,也可以是后面要讨论的复合数据类型,但不允许是数组类型或函数类型。,函数定义时需注明函数类型。C语言缺省类型为int。C继承C,但有

4、些版本会不同,因此最好具体指定,如确实不需要指明类型,就采用void类型(空类型)。,函数参数包括形式参数和实际参数。形式参数是用逗号分隔的变量说明列表,这些变量称为函数的形式参数,有时也简称为形参。形式参数用于接收从函数调用程序传给这个函数的数据。,实际参数是用逗号分隔的表达式列表,其中每一个表达式称为实际参数,有时也简称为实参。在函数调用时,需要将实参的值传送给对应位置的形式参数,因而要求实参个数必须和形参个数相同(缺省参数或可变数目参数情况例外),并且实参的类型必须与对应的形参类型相匹配。,函数参数传递(两种情况)主调函数调用被调函数时,函数执行所需的参数如何从主调函数传入到被调函数中去

5、;函数执行完后,所得到的执行结果如何传送回主调函数中。,参数传递1实参形参(包括值的传递(传值);地址的传递(传地址),参数传递2 执行结果主调函数形式:return表达式;或 return(表达式);功能:计算出表达式的值并返回给主调函数,退出函数执行,把执行回归到主调函数。,注意:采用return只能返回一个值 如 return x;不能用return x,y;也不能用return x;return y;。,参数传递3(可用于两者)采用全局变量形式,但要注意有没有副作用(尽可能少用此形式)。函数定义时的参数说明:在圆括号内说明,如果没有参数,也不能省去圆括号。,函数举例int max(in

6、t x,int y)/函数定义 int max(int,int);/函数原型 void main()/没有具体参数,函数体函数体是用花括号“”和“”括住的语句序列,分为说明部分和语句部分,用于描述这个函数所要执行的操作(即实现其功能的具体执行过程)。函数体可以为空,但花括号不能省去。如:int max(int x,int y),函数值的返回及控制的转移:return 语句函数值的返回:return表达式;这种形式只能返回一个值,若有多个值返回,只能考虑用数组指针等形式。,控制返回:return 表达式;/两者兼者(函数值返回及控制返回)return;/控制返回 若没有return,遇到“”也就

7、默认“return”功能了。,3.内联函数与非内联函数1)内联函数定义形式:inline 函数类型函数名(函数形参说明)函数体2)非内联定义形式:函数类型函数名(函数形参说明)函数体,3)内联函数的调用形式:与非内联函数一样,但执行过程不一样。一般函数调用:通过控制转移来实现。其简化图如下:,内联函数调用:在编译时把内联函数的函数体的代码直接COPY到主调函数中,然后再进行编译。从用户使用观念上仍属于函数调用形式;但实际上属于程序代码的替换。,内联函数调用的例子如下:,#include#includeinline double add(double x,double y)/内联函数 retur

8、n(x+y);/函数体void main()cout2+2=add(2.0,2.0)endl;cout2.2+3.14159=add(2.2,3.14159)endl;cout3.13+3.23=add(3.13,3.23)endl;getch();/等待输入,以观察结果 编译预处理之后有等价程序:void main()cout2+2=2.0+2.0 endl;cout2.2+3.14159=2.2+3.14159 endl;cout3.13+3.23=3.13+3.23 endl;getch();,4.函数定义的例子 重复处理用户的选择,使用无参数的函数及返回值为空值类型的函数。,#incl

9、ude/由用户在菜单中选择 int select()int sel;/用户输入的选择 coutsel;return sel;,/对用户的选择分别处理 void handle(int choice)switch(choice)case 0:break;case 1:coutYour choice is apple.endl;break;case 2:coutYour choice is pear.endl;break;case 3:coutYour choice is banana.endl;break;case 4:coutYour choice is orange.endl;break;de

10、fault:coutYour choice is invalid.endl;,void main()int choice=1;/用户输入的选择/反复处理用户的选择 while(choice!=0)choice=select();handle(choice);coutThank you for your choiceendl;,5.函数定义时的注意事项1)函数定义要尽可能使它通用,不要用途过于专一;2)尽量不要在函数内安排I/O,执行所需参数由形参传入,执行结果返回给主调函数自行处理;3)分析好问题要求,正确返回相应结果;4)函数名尽可能名实相符,不要使用无意义的函数名;5)提高安全可靠性(执行

11、参数要有安全检查,可在主调函数进行,也可以被调函数内进行)。,6.函数调用 1)函数调用的一般方法:由函数名和和函数调用运算符()组成,还必须给出具体函数参数,函数参数用圆括号括起来。函数调用的一般形式为:函数名(实际参数表),2)按函数在程序中出现的位置来分,可以有三种函数调用方式:函数语句 作为函数表达式的因子 作为函数参数,函数语句把函数调用作为一个语句,如:getch();/读入一字符,该程序头用#include包含所需库函数这时不要求函数带回值,只要求函数完成一定的操作,作为函数表达式的因子函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运

12、算,如:y=max(i,j);,作为函数参数函数调用本身就是一个函数参数,如:long ack(int m,int n)if(m=0)return n+1;else if(n=0)return(ack(m-1,1);else return(ack(m-1,ack(m,n-1);,7.函数与模块 1)大程序研制管理:将程序划分为若干模块,以文件作为划分的主要机制,每一部分放在一个文件中,一个程序划分为若干部分。2)文件模块:组成C程序的文件称为文件模块,有时简称为模块(module)。C以模块作为编译的基本单位。3)大程序研制:将程序划分为若干模块,分别编写、编译以提高开发效率。一个模块可以供多

13、个程序使用,提高了代码的可重用性。,8.内联函数,在函数调用时进行参数传递和上下文切换需要一定的时间和空间的开销,可能会影响程序需要使用的内存大小及其性能。C语言提供的解决方法是使用内联函数(inline function),即在编译时将所调用的函数的代码直接嵌入到调用函数的调用处,而不是将程序流程转出去。这种嵌入到调用函数中的函数就称为内联函数。如果一个函数在定义时使用了inline修饰符,则此函数为内联函数,对该函数的任何调用都将被替换成该函数的函数体语句,没有调用的开销。,例子,如果不用内联函数,tax函数用一个常量系数计算税收。include double tax(double gro

14、ss)return gross*0.05;void main()double temp=5.0;couttax(temp);,使用内联函数,在tax函数的声明前中上inline修饰符。inline double tax(double gross)return gross*0.05;则tax就变成内联函数了。在编译时,调用函数中的函数调用语句 couttax(temp);将被内联函数tax的函数体替换,同时将实参代替形参,得到语句 couttemp*0.05;,一个内联函数可以有多行代码,可以定义内嵌的语句块,而且可以有其局部变量。作为一个C函数,内联函数也可以进行参数类型检查和调试操作。,程序

15、:max.cpp,功能:演示内联函数 include inline int max(int,int,int)void main()int i=10,j=20,k=30,m;m=max(i,j,k);coutt)t=c;return t;,在每个函数调用处内联函数的函数体直接插入到调用函数代码中。这样,有多少处函数调用就在被编译的目标代码中有多少个内联函数的副本代码。可见这个用法将会改变目标代码的长度。内联函数改善了程序的性能,但如果声明为inline的函数的执行开销不是整个程序执行时间的主要部分,这种性能上的改善可能不明显。同时,内联函数加大了可执行程序,因此可能导致额外的内外存的交换而实际上降低了执行速度。,而且,inline修饰符不是一个无条件指令,它只是向编译程序提出一个建议,要求将其代码嵌入调用函数。并非一经声明为inline,编译程序就必须按内联的规则做。如果编译程序认为inline所修饰的函数很长很复杂,编译程序可以忽略这种建议,把它当做一般的函数处理。有些C程序不接受有控制结构(如循环语句和switch语句)的内联函数。有些编译程序打官腔一两个if语句,但不接受循环结构。因此,内联函数中不能包括复杂的控制结构,应该只对简单的函数使用内联功能。,上一节返回下一节,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号