C语言函数与宏定义课件.ppt
《C语言函数与宏定义课件.ppt》由会员分享,可在线阅读,更多相关《C语言函数与宏定义课件.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*1/49第第1章章函数与宏定义函数与宏定义1.1函数概念函数概念 1.2变量作用域和存储类型变量作用域和存储类型1.3内部函数与外部函数内部函数与外部函数1.4递归函数的设计和调用递归函数的设计和调用1.5预处理预处理1.6综合范例综合范例C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*2/491.1函数概念函数概念 C语言中,函数可分为两类语言中,函数可分为两类:一类是由系统定义的一类是由系统定义的标准函数标准函数,又称为,又称为库函数库函数,其函数,其函数声明一般是放在系统的声明一般
2、是放在系统的include目录下以目录下以.h为后缀的头文为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函件中,如在程序中要用到某个库函数,必须在调用该函数之前用数之前用#include命令将库函数信息包含到命令将库函数信息包含到本程序中。本程序中。另一类函数是另一类函数是自定义函数自定义函数C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*3/491.1.1函数定义函数定义存储类型符存储类型符返回值类型符返回值类型符函数名函数名(形参说明表形参说明表)函数语句体函数语句体C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*4/
3、49说明:说明:1存储类型符存储类型符指的是函数的作用范围,它只有两种指的是函数的作用范围,它只有两种形式:形式:static和和extern。static说明函数只能作用于其所在的源文件,用说明函数只能作用于其所在的源文件,用static说说明的函数又称为明的函数又称为内部函数内部函数。extern说明函数可被其它源文件中的函数调用,用说明函数可被其它源文件中的函数调用,用extern说明的函数,又称为说明的函数,又称为外部函数外部函数。缺省缺省情况为情况为extern。2返返回回值值类类型型符符指指的的是是函函数数体体语语句句执执行行完完成成后后,函函数数返返回回的的值值的的类类型型,如如
4、int,float,char等等等等,若若函函数数无返回值,则用无返回值,则用空类型空类型void来定义函数的返回值。来定义函数的返回值。缺省缺省情况为情况为int型。型。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*5/493函数名函数名由任何合法的标识符构成。建议将函数名由任何合法的标识符构成。建议将函数名的命名与函数内容有一定关系。的命名与函数内容有一定关系。4形形参参说说明明表表是是一一系系列列用用逗逗号号分分开开的的每每个个形形参参变变量量说明。说明。如:如:intx,inty,intz这表示形参变量有三个:这表示形参变量有三个:x,y,z。它们的类型
5、都是。它们的类型都是int型。型。5函数语句体函数语句体是放在一对花括号是放在一对花括号中,由局部数据类中,由局部数据类型描述和功能实现两部分组成。型描述和功能实现两部分组成。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*6/496函数返回语句函数返回语句的形式有以下两种:的形式有以下两种:函数无返回值的情况:函数无返回值的情况:return;或者什么也不写;或者什么也不写函数有返回值的情况:函数有返回值的情况:return(表达式的值表达式的值);在在第第种种情情况况下下要要注注意意“表表达达式式的的值值”的的类类型型必必须须与与函数返回值的类型相一致。函数返
6、回值的类型相一致。例例如如:求求两两个个任任意意整整数数的的绝绝对对值值的的和和,用用函函数数abs_sum()实现。实现。/*直接调用库函数来计算直接调用库函数来计算m和和n的绝对值的绝对值*/intabs_sum(intm,intn)return(abs(m)+abs(n);/*函数函数abs()是在头文件是在头文件math.h中声明的中声明的*/C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*7/49函数定义如下:函数定义如下:intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;return(m+n);1.1.2函数声明和调
7、用函数声明和调用1函数的声明函数的声明函数声明的一般形式:函数声明的一般形式:存储类型符存储类型符返回值类型符返回值类型符函数名函数名(形参说明表形参说明表);如:如:intabs_sun(intm,intn);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*8/492函数调用函数调用函数调用是通过函数调用语句来实现的,分两种形式:函数调用是通过函数调用语句来实现的,分两种形式:无返回值的情况:无返回值的情况:函数名函数名(实参表实参表);有返回值的情况:有返回值的情况:变量名函数名变量名函数名(实参表实参表);该变量名的类型必须与函数的返回值类型相同。该变量名的
8、类型必须与函数的返回值类型相同。函函数数调调用用时时都都会会去去执执行行函函数数语语句句中中的的内内容容,函函数数执执行行完完毕后,回到函数的调用处,继续执行下面的语句。毕后,回到函数的调用处,继续执行下面的语句。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*9/491.1.3函数的传值方式函数的传值方式函数的传值方式函数的传值方式:采用实参表将每一个实参的值相应地传递给每一个形采用实参表将每一个实参的值相应地传递给每一个形参变量,形参变量在接收到实参表传过来的值时,会在内参变量,形参变量在接收到实参表传过来的值时,会在内存存临时开辟新的空间临时开辟新的空间,以
9、保留形参变量的值,当函数执行,以保留形参变量的值,当函数执行完毕时,这些完毕时,这些临时开辟的内存空间会被释放临时开辟的内存空间会被释放,并且形参的,并且形参的值在函数中不论是否发生变化,值在函数中不论是否发生变化,都不会影响到实参变量的都不会影响到实参变量的值的变化值的变化,这就是函数的传值方式。,这就是函数的传值方式。自定义函数在程序中的使用顺序有两种形式:自定义函数在程序中的使用顺序有两种形式:先进行函数声明,再进行函数调用,先进行函数声明,再进行函数调用,函数定义放在函数定义放在函数调用之后。函数调用之后。函数声明在函数调用之前。函数声明在函数调用之前。函数定义放在函数调用之前。函数定
10、义放在函数调用之前。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*10/49【例例1-1】编编程程序序,通通过过调调用用函函数数abs_sum(),求求任任意意两个整数的绝对值的和。两个整数的绝对值的和。/*exam1_1.c调用函数求两整数绝对值的和调用函数求两整数绝对值的和*/#includeintabs_sum(intm,intn);main()intx,y,z;scanf(%d%d,&x,&y);z=abs_sum(x,y);printf(sumis%d,z);intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;retu
11、rnm+n;程序运行结果程序运行结果程序运行结果程序运行结果:712712 sumis19sumis19C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*11/49用传值方式调用函数时,实参也可以是函数调用语句用传值方式调用函数时,实参也可以是函数调用语句【例例1-2】求任意三个数的绝对值的和。求任意三个数的绝对值的和。/*exam1_2.c调用函数求三个整数绝对值的和调用函数求三个整数绝对值的和*/#includeintabs_sum(intm,intn);main()intx,y,z,sum;scanf(%d%d%d,&x,&y,&z);sum=abs_sum(
12、abs_sum(x,y),z);printf(sumis%d,sum);intabs_sum(intm,intn)if(m0)m=-m;if(n0)n=-n;returnm+n;程序运行结果程序运行结果:7125 sumis24C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*12/49注意:注意:对于有返回值的函数,调用时若没有把它赋给某个变量,对于有返回值的函数,调用时若没有把它赋给某个变量,仍然是可以的,只是函数的返回值有可能会被丢失。仍然是可以的,只是函数的返回值有可能会被丢失。【例例1-3】求任意两数的乘积。求任意两数的乘积。自定义一个函数自定义一个函数m
13、ul(),用于求两数的乘积,程序:,用于求两数的乘积,程序:/*exam1_3.c求两个数的乘积求两个数的乘积*/#includefloatmul(floata,floatb);main()floatx,y,z;scanf(%f%f,&x,&y);z=mul(x,y);/*/x=x+10;y=y-10;mul(x,y);/*/C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*13/49x=x*2;y=y*2;printf(z=%f,mul(%f,%f)=%fn,z,x,y,mul(x,y);/*/floatmul(floata,floatb)returna*b;程序
14、运行结果程序运行结果:56 z=30.000000,mul(30.000000,-8.000000)=-240.000000C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*14/49程序说明程序说明:注释注释处调用函数后的返回值赋给变量处调用函数后的返回值赋给变量z。注释注释处调用函数后的返回值没有赋给任何变量,处调用函数后的返回值没有赋给任何变量,函数的返回值被丢失。函数的返回值被丢失。注释注释处调用函数后的返回值成为了处调用函数后的返回值成为了printf()函数的函数的参数。参数。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*
15、15/491.2变量作用域和存储类型变量作用域和存储类型1变量的作用域变量的作用域变量的作用域:指的是变量的作用域:指的是变量的有效范围变量的有效范围,针对变量不同,针对变量不同的作用域,可把变量分为局部变量和全局变量。的作用域,可把变量分为局部变量和全局变量。局部变量局部变量:在函数内部或某个控制块的内部定义的变量:在函数内部或某个控制块的内部定义的变量为局部变量,局部变量的有效范围只限于为局部变量,局部变量的有效范围只限于本函数内部本函数内部,退出函数,该变量自动失效。退出函数,该变量自动失效。全局变量全局变量:在函数外面定义的变量称为全局变量,全局变:在函数外面定义的变量称为全局变量,全
16、局变量的作用域是从该变量定义的位置开始,直到源文件结束。量的作用域是从该变量定义的位置开始,直到源文件结束。在在同一文件同一文件中的所有函数都可以引用全局变量。中的所有函数都可以引用全局变量。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*16/49局部变量和全局变量的局部变量和全局变量的作用域作用域如图所示:如图所示:C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*17/49【例例1-4】变量作用域应用举例,阅读下面的程序,变量作用域应用举例,阅读下面的程序,注意区分局部变量和全局变量的作用域。注意区分局部变量和全局变量的作用域。/
17、*exam9_4.c变量作用域举例变量作用域举例*/#includevoida(void);voidb(void);voidc(void);intx=1;main()intx=5;printf(localxinouterscopeofmainis%dn,x);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*18/49intx=7;printf(localxininnerscopeofmainis%dn,x);printf(localxinouterscopeofmainis%dn,x);a();b();c();a();b();c();前三次输出前三次输出结果结果:
18、localxinouterscopeofmainis5localxininnerscopeofmainis7localxinouterscopeofmainis5C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*19/49printf(localxinmainis%dn,x);getchar();return0;voida(void)intx=25;printf(nlocalxinais%dafterenteringan,x);+x;printf(localxinais%dbeforeexitingan,x);C C 程序设计基础教程程序设计基础教程第九章第九章函数
19、与宏定义函数与宏定义*20/49voidb(void)staticintx=50;printf(nlocalstaticxis%donenteringbn,x);+x;printf(localstaticxis%donexitingbn,x);voidc(void)printf(nglobalxis%donenteringcn,x);x*=10;printf(globalxis%donexitingcn,x);C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*21/49程序运行结果程序运行结果:后后6次函数调用次函数调用localxinais25afterenter
20、ingalocalxinais26beforeexitingalocalstaticxis50onenteringblocalstaticxis51onexitingbglobalxis1onenteringcglobalxis10onexitingclocalxinais25afterenteringalocalxinais26beforeexitingalocalstaticxis51onenteringblocalstaticxis52onexitingbglobalxis10onenteringcglobalxis100onexitingc最后一次输出:最后一次输出:localxinm
21、ainis5C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*22/492变量的存储类型变量的存储类型变量的存储类型:指的是变量的变量的存储类型:指的是变量的存储属性存储属性,它说明,它说明变量变量占用存储空间的区域。占用存储空间的区域。在内存中,供用户使用的存储区由在内存中,供用户使用的存储区由程序区程序区、静态存储区静态存储区和和动态存储区动态存储区三部分组成。三部分组成。变量的存储类型有四种:变量的存储类型有四种:auto型、型、register型、型、static型和型和extern型。型。auto型型变量存储在内存的变量存储在内存的动态存储区动态存储区。r
22、egister型变量保存在型变量保存在寄存器寄存器中。中。static型变量和型变量和extern型变量型变量存储在存储在静态存储器静态存储器。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*23/49局部变量局部变量的存储类型缺省值为的存储类型缺省值为auto型型。全局变量全局变量的存储类型缺省值为的存储类型缺省值为extern型型。auto型变量和型变量和register型变量只用于定义局部变量。型变量只用于定义局部变量。static型变量即可定义成局部变量,又可定义成全局变量。型变量即可定义成局部变量,又可定义成全局变量。【例例1-5】设计一个函数:设计一个
23、函数:longfac(intn),可用来计算,可用来计算15的阶乘。的阶乘。分析:可在函数中定义一个分析:可在函数中定义一个static型变量,用来保存型变量,用来保存上次的计算结果。上次的计算结果。C C 程序设计基础教程程序设计基础教程第九章第九章函数与宏定义函数与宏定义*24/49/*exam1_5.c用用static型型变变量量保保留留上上次次阶阶乘乘的的值值*/#includelongfac(intn)staticintf=1;f=f*n;returnf;main()inti;for(i=1;i=5;i+)printf(%d!=%ldn,i,fac(i);程序运行结果程序运行结果:1
24、!=12!=23!=64!=245!=120局部变量局部变量局部变量局部变量f f被定义成被定义成被定义成被定义成staticstatic型的,因型的,因型的,因型的,因此,它只在该函数第此,它只在该函数第此,它只在该函数第此,它只在该函数第1 1次被调用的次被调用的次被调用的次被调用的时候初始化其值为时候初始化其值为时候初始化其值为时候初始化其值为1 1,以后再调用,以后再调用,以后再调用,以后再调用该函数时,不再进行初始化,而该函数时,不再进行初始化,而该函数时,不再进行初始化,而该函数时,不再进行初始化,而是使用上一次调用的值。是使用上一次调用的值。是使用上一次调用的值。是使用上一次调用
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 函数 定义 课件
限制150内