




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第 6 章章 函数与宏定义函数与宏定义6.1 函数概念函数概念 C 函数分规范函数函数分规范函数(库函数库函数)和自定义函数。和自定义函数。 一切函数都是平行的,相互独立不能嵌套定义,函数一切函数都是平行的,相互独立不能嵌套定义,函数间可以相互调用,但不能调用间可以相互调用,但不能调用main()函数。函数。6.1.1 函数的定义函数的定义古典方式:古典方式:类型标识符类型标识符 函数名函数名(方式参数表方式参数表)方式参数阐明;方式参数阐明; 函数体;函数体;现代简约方式:现代简约方式:类型标识符类型标识符 函数名函数名(形参阐明表形参阐明表) 函数体函数体;例:例: int max(x,
2、y)int x, y;/ 方式参数阐明方式参数阐明 / int z;/ 函数体中的阐明部分函数体中的阐明部分 / z=xy ? x : y; return(z);这两行可以写成一行:这两行可以写成一行:int max(int x, int y)例:例: int max(int x, int y) int z;/ 函数体中的阐明部分函数体中的阐明部分 / z=xy ? x : y; return(z);函数参数和函数的值函数参数和函数的值1方式参数和实践参数方式参数和实践参数例例 从键盘输入两个数,输出其中较大的一个。从键盘输入两个数,输出其中较大的一个。 main( ) int a, b, c
3、 ; scanf(%d %d, &a, &b); c=max(a,b); /* a, b为实践参数为实践参数 */ printf(Max is %d,c); getch(); max(int x, int y) /* x, y为方式参数为方式参数 */ int z; z=xy ? x : y; return(z); 形参变量在被调用前不占用存储单元;在被调形参变量在被调用前不占用存储单元;在被调用终了后,形参所占存储单元亦被释放。用终了后,形参所占存储单元亦被释放。 实参可以是常量、变量或表达式。实参可以是常量、变量或表达式。 必需指定形参类型,且应与实参的类型一致。必需指定形
4、参类型,且应与实参的类型一致。 实参对形参的数据传送是实参对形参的数据传送是“值传送。即单向值传送。即单向传送,不能逆传。传送,不能逆传。 留意:留意: 函数的前往值是经过函数的前往值是经过return语句获得的。语句获得的。 return语句的后面可以有括号,也可以没有。如:语句的后面可以有括号,也可以没有。如: return z ; return(z); return语句的后面可以是变量,也可以是表达式。如:语句的后面可以是变量,也可以是表达式。如: return(x y ? x : y); return语句前往值的类型应与该函数的类型一致。否语句前往值的类型应与该函数的类型一致。否那么以
5、函数类型为准。那么以函数类型为准。 函数类型缺省时按整型处置。函数类型缺省时按整型处置。2函数的前往值函数的前往值 假设函数中没有假设函数中没有return语句,那么函数被调用后也会语句,那么函数被调用后也会带回不确定的值。带回不确定的值。 为了明确表示不需求函数前往值,可以用为了明确表示不需求函数前往值,可以用“void定定义函数为义函数为“无类型。此时,不得运用无类型。此时,不得运用a=f( )之类的赋之类的赋值语句。值语句。凡不需求前往值的函数,普通均定义为凡不需求前往值的函数,普通均定义为“void类类型。型。1函数调用的普通方式函数调用的普通方式函数名函数名(实参表实参表)阐明:阐明
6、: 对于无参函数,也不得省略一对小括号。对于无参函数,也不得省略一对小括号。“实参表中的参数之间用逗号分开。实参表中的参数之间用逗号分开。 实参与形参之间的个数及类型必需一一对应。实参与形参之间的个数及类型必需一一对应。函数的调用函数的调用 将函数调用作为一个语句。如:将函数调用作为一个语句。如: printf(“MS C pragramming); gets(s); 将被调用的函数写在表达式中。如:将被调用的函数写在表达式中。如: c=2max(a, b); 留意:被调用函数留意:被调用函数max必需有确定的前往值。必需有确定的前往值。 将函数调用作为一个函数的实参。如:将函数调用作为一个函
7、数的实参。如: m=max(max(a, b), c); 2函数调用的方式函数调用的方式3对被调用函数的阐明对被调用函数的阐明在一个函数中调用另一个函数时:在一个函数中调用另一个函数时: 假设被调函数为库函数,那么应在文件开头假设被调函数为库函数,那么应在文件开头用用“#include命令声明相应的命令声明相应的“头文件。头文件。如:如: #include “stdio.h #include “math.h 假设被调函数为自定义函数且其定义在主调函数定义假设被调函数为自定义函数且其定义在主调函数定义之后,那么应在主调函数中对该函数进展声明。其语句之后,那么应在主调函数中对该函数进展声明。其语句
8、方式普通为:方式普通为: 类型标识符类型标识符 被调函数名被调函数名(参数列表参数列表); 如:如:float add(int x, int y ); 假设被调函数为自定义函数且其定义在主调函数定义假设被调函数为自定义函数且其定义在主调函数定义之前,那么在主调函数中可不用声明。之前,那么在主调函数中可不用声明。 假设已在一切函数定义之前已作了函数声明,那么在假设已在一切函数定义之前已作了函数声明,那么在各主调函数中可不用对所调用的函数再作声明。如:各主调函数中可不用对所调用的函数再作声明。如: char letter( ); float f( ); int i( ); main( ) / 不用
9、阐明它所调用的函数的类型不用阐明它所调用的函数的类型 / 1部分变量部分变量部分变量部分变量-在一个函数内部定义的变量,只能在本在一个函数内部定义的变量,只能在本函数内运用和有效。函数内运用和有效。主函数主函数main中定义的变量,也只能在主函数内运用中定义的变量,也只能在主函数内运用和有效。和有效。不同的函数中可以运用一样名字变量,且互不干扰。不同的函数中可以运用一样名字变量,且互不干扰。方式参数也是部分变量,也只能在所在函数内运用和方式参数也是部分变量,也只能在所在函数内运用和有效。有效。可以在一个函数内的复合语句中定义变量,且这些变可以在一个函数内的复合语句中定义变量,且这些变量只在本复
10、合语句中有效。量只在本复合语句中有效。 这种复合语句也称为这种复合语句也称为“分程序或分程序或“子模块。子模块。部分变量和全局变量部分变量和全局变量6.2 变量的作用域和存储类型变量的作用域和存储类型2全局变量全局变量全局变量全局变量(外部变量外部变量)-在函数在函数(包括包括main函数函数)外定义的外定义的变量。其有效范围为从定义变量的位置开场到根源文变量。其有效范围为从定义变量的位置开场到根源文件终了。件终了。 在文件开头定义的外部变量才可在整个文件范围内运用,假设在文件开头定义的外部变量才可在整个文件范围内运用,假设在定义点之前的函数需援用外部变量,那么可用关键字在定义点之前的函数需援
11、用外部变量,那么可用关键字“extern作作“外部变量声明。外部变量声明。 留意:留意: 外部变量的定义只能有一次,它的位置在一切函数之外。而同外部变量的定义只能有一次,它的位置在一切函数之外。而同一程序中的外部变量声明可以有多次,它的位置在函数之内一程序中的外部变量声明可以有多次,它的位置在函数之内(哪个函数要用就在哪个函数中阐明哪个函数要用就在哪个函数中阐明)。系统根据外部变量的定。系统根据外部变量的定义义(而不是根据外部变量的阐明而不是根据外部变量的阐明)分配存储单元。对外部变量的分配存储单元。对外部变量的初始化只能在初始化只能在“定义时进展,定义时进展,“extern只是声明该变量是只
12、是声明该变量是一个已在外部定义过的变量而已。一个已在外部定义过的变量而已。 假设在同一源文件中,外部变量与部分变量同名,那么在部分假设在同一源文件中,外部变量与部分变量同名,那么在部分变量的作用范围内,外部变量不起作用。变量的作用范围内,外部变量不起作用。 输出结果:输出结果:10, 4, 810, 2, 5例例#include stdio.hmain( ) int a=1, b=2, c=3; a+; c+=b; int b=4, c; c=2*b; a+=c; printf(%d,%d,%dn, a, b, c); printf(%d,%d,%dn, a, b, c); getch();
13、内存中供用户运用的存储区由程序区、静态存储区内存中供用户运用的存储区由程序区、静态存储区和动态存储区组成。和动态存储区组成。 变量的存储类型有四种:变量的存储类型有四种: 自动的自动的(auto):内存的动态存储区:内存的动态存储区 静态的静态的(static) :静态存储区:静态存储区 存放器的存放器的(register):存放器:存放器静态变量在程序的运转期间占用固定的存储空间,直到静态变量在程序的运转期间占用固定的存储空间,直到程序的终止而释放;程序的终止而释放;动态变量是在程序的运转期间随着函数的调用随时动态动态变量是在程序的运转期间随着函数的调用随时动态地占用和释放存储空间。地占用和
14、释放存储空间。变量的存储类型变量的存储类型部分变量的存储方式部分变量的存储方式函数中的部分变量假设未专门阐明,这类部分变量称为函数中的部分变量假设未专门阐明,这类部分变量称为自动变量,其类型阐明前不论能否有关键字自动变量,其类型阐明前不论能否有关键字“auto,都属于动态存储类别。,都属于动态存储类别。2) 假设希望被调函数在终了后,其部分变量占用的存储假设希望被调函数在终了后,其部分变量占用的存储空间不释放,以便保管其变量的值,用于下次调用该函空间不释放,以便保管其变量的值,用于下次调用该函数,那么用数,那么用“static阐明为阐明为 “部分静态变量。部分静态变量。 部分静态变量部分静态变
15、量 在静态存储区分配存储单元,在程序的整个运转期间在静态存储区分配存储单元,在程序的整个运转期间都不释放。都不释放。 在编译时只赋初值一次,以后每次被调用时不再重新在编译时只赋初值一次,以后每次被调用时不再重新赋值而只保管前次被调用终了时的值。赋值而只保管前次被调用终了时的值。 假设未赋初值,那么在编译时自动赋初值假设未赋初值,那么在编译时自动赋初值0 (数值型数值型)或或空字符空字符(字符字符 型型)。 虽然部分静态变量在函数被调用终了后其值依然存在,虽然部分静态变量在函数被调用终了后其值依然存在,但其它函数是不能援用的。但其它函数是不能援用的。动态变量动态变量 在动态存储区分配存储单元,函
16、数调用终了后即释放。在动态存储区分配存储单元,函数调用终了后即释放。 赋初值不是在编译时而是在函数被调用时进展的,函赋初值不是在编译时而是在函数被调用时进展的,函数每次被调用时重新赋值。数每次被调用时重新赋值。 假设未赋初值,那么其值是不确定的假设未赋初值,那么其值是不确定的例例 打印打印1到到5的阶乘值。的阶乘值。 int fac(int n) static int f =1; / 定义定义f 为为int型静态变量型静态变量 / f = f n ; return( f ); main( ) int i; for (i=1; i1 f(0)=1,f(1)=1long fac(int n) lo
17、ng result; if(n=0|n=1) result=1; else result=n*fac(n-1); return result;main( ) int n; long f; printf(Please enter value of n:n); scanf(%d,&n); if(n(c+d)?(a+b):(c+d) 假设第一行写成:假设第一行写成: #define MAX(x,y) xy ? x : y 那那么这里的么这里的 t 展开后为展开后为 t = a+bc+d?a+b:c+d 由于置换展开是用由于置换展开是用“表达式对等的置换表达式对等的置换“形参表形参表中的参数。
18、中的参数。 定义带参数的宏,可以实现一些简单的函数功能。定义带参数的宏,可以实现一些简单的函数功能。如:如: #define MAX(x,y) (x)(y)?(x) : (y) main( )int a, b, c, t ; t = MAX(a+b, c+d); 6.5.2 “文件包含文件包含 用用 #include 命令实现一个文件包含另一个文件。命令实现一个文件包含另一个文件。 语句方式:语句方式: #include “文件名文件名例例#include stdio.h#define N 2#define M N+1#define NUM (M+1)*M/2main( ) int i, n=
19、0; for (i=1; i=NUM; i+) n+; printf(%2d, n); getch();输出结果:输出结果:1 2 3 4 5 6 7 8 一个一个include命令只能指定一个被包含文件,命令只能指定一个被包含文件,假设要包含假设要包含n个文件,那么要用个文件,那么要用n个个include命命令。令。 NUM被代换展开后为:被代换展开后为:( 2+1+1) 2+1/2#include命令中,文件名既可用双引命令中,文件名既可用双引“ 号号(引荐,引荐,也可用尖括号也可用尖括号括起来。括起来。表示被包含在规范目录表示被包含在规范目录中中(include).“表示被包含文件在指定
20、目录中,假表示被包含文件在指定目录中,假设只需文件名不带途径,那么在当前目录中,假设设只需文件名不带途径,那么在当前目录中,假设找不到,再到规范目录中找。找不到,再到规范目录中找。包含文件名可以是包含文件名可以是.c源文件或源文件或.头文件,如头文件,如#include #include “myhead.h#include “D:myexammyfile.c6.12 条件编译条件编译语句方式:语句方式:1#ifdef 宏名宏名程序段程序段1 #else程序段程序段2 #endif 作用:假设宏名已定义,那么编译作用:假设宏名已定义,那么编译“程序段程序段1,否那么编译,否那么编译“程序段程序段2 。 所谓所谓“宏名已定义是无论宏名已定义是无论“宏名定义为什么内宏名定义为什么内容。容。 条件编译的作用:缩短编译时间,减少目的程序条件编译的作用:缩短编译时间,减少目的程序的长度。的长度。 作用:假设宏名未定义,那么编译作用:假设宏名未定义,那么编译“程序段程序段1 ,否,否那么编译那么编译“程序段程序段2。3#if 表达式表达式程序段程序段1 #else程序段程序段2 #endif 作用:当作用:当“表达式值为非表达式值为非0 ,那么编译,那么编译“程序段程序段1 ,否那么
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年文化旅游演艺项目策划与运营模式文化体验设计创新报告
- 老年教育课程设置2025:生活化教学与个性化培养实践报告
- 分布式能源系统2025年生物质能源应用能效提升与优化分析报告
- 2025年医养结合养老机构养老地产开发与运营策略报告
- 基于2025年视角的老旧街区改造社会稳定风险评估体系构建报告001
- 2025年二手奢侈品市场鉴定标准与交易规范行业市场细分领域消费趋势研究报告
- 2025年社区心理健康服务社区参与度提升策略报告
- 互联网金融服务平台在金融科技人才培养中的应用研究
- 2025年医药企业研发外包(CRO)模式药物研发疫苗研发与生产报告
- 2025年医药企业研发外包(CRO)模式的成本效益分析与优化路径报告
- 七年级体育与健康上册《水平四跳绳》教学设计
- E H涡街流量计72型操作手册(中文)
- NB/T 11462-2023带式输送机用液压卷带装置
- 多酸化学智慧树知到期末考试答案章节答案2024年东北师范大学
- 四川省成都市双流区2023-2024学年部编版八年级下学期期末质量监测历史试题
- 物流保密协议物流运输保密协议
- 2024年浙江省普通高中学业水平适应性考试历史试题(含答案)
- 5G-A通感一体应用场景研究 2024
- 会议记录范文模板
- 我国医疗保险制度的变迁
- 中国减薄机行业市场现状分析及竞争格局与投资发展研究报告2024-2034版
评论
0/150
提交评论