




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、6.1 函数概念函数概念 C 函数分标准函数(库函数)和自定义函数。 所有函数都是平行的,相互独立不能嵌套定义,函数间可以相互调用,但不能调用main()函数。第1页/共40页6.1.1 函数的定义古典形式:古典形式:类型标识符类型标识符 函数名函数名(形式参数表形式参数表)形式参数说明;形式参数说明; 函数体;函数体;现代简洁形式:现代简洁形式:类型标识符类型标识符 函数名函数名(形参说明表形参说明表) 函数体函数体;第2页/共40页例: int max(x,y)int x, y;/ 形式参数说明 / int z;/ 函数体中的说明部分 / z=xy ? x : y; return(z);这
2、两行可以写成一行:int max(int x, int y)例: int max(int x, int y) int z;/ 函数体中的说明部分 / z=xy ? x : y; return(z);第3页/共40页函数参数和函数的值函数参数和函数的值1形式参数和实际参数形式参数和实际参数例例 从键盘输入两个数,输出其中较大的一个。 main( ) int a, b, c ; scanf(%d %d, &a, &b); c=max(a,b); /* a, b为实际参数 */ printf(Max is %d,c); getch(); max(int x, int y) /* x, y为形式参数
3、*/ int z; z=xy ? x : y; return(z); 第4页/共40页 形参变量在被调用前不占用存储单元;在被调用结束后,形参所占存储单元亦被释放。 实参可以是常量、变量或表达式。 必须指定形参类型,且应与实参的类型一致。 实参对形参的数据传递是“值传递”。即单向传递,不能逆传。 注意注意:第5页/共40页 函数的返回值是通过return语句获得的。 return语句的后面可以有括号,也可以没有。如: return z ; return(z); return语句的后面可以是变量,也可以是表达式。如: return(x y ? x : y); return语句返回值的类型应与该函
4、数的类型一致。否则以函数类型为准。 函数类型缺省时按整型处理。2函数的返回值函数的返回值第6页/共40页 若函数中没有return语句,则函数被调用后也会带回不确定的值。 为了明确表示不需要函数返回值,可以用“void”定义函数为“无类型”。此时,不得使用a=f( )之类的赋值语句。凡不需要返回值的函数,一般均定义为“void”类型。第7页/共40页1函数调用的一般形式函数调用的一般形式函数名函数名(实参表实参表)说明:说明: 对于无参函数,也不得省略一对小括号。“实参表”中的参数之间用逗号分开。 实参与形参之间的个数及类型必须一一对应。函数的调用函数的调用第8页/共40页 将函数调用作为一个
5、语句。如: printf(“MS C pragramming”); gets(s); 将被调用的函数写在表达式中。如: c=2 max(a, b); 注意注意:被调用函数max必须有确定的返回值。 将函数调用作为一个函数的实参。如: m=max(max(a, b), c); 2函数调用的方式函数调用的方式第9页/共40页3对被调用函数的说明对被调用函数的说明在一个函数中调用另一个函数时: 如 果 被 调 函 数 为 库 函 数 , 则 应 在 文 件 开 头 用“#include”命令声明相应的“头文件”。如: #include “stdio.h” #include “math.h” 如果被调
6、函数为自定义函数且其定义在主调函数定义之后,则应在主调函数中对该函数进行声明。其语句形式一般为: 类型标识符类型标识符 被调函数名被调函数名(参数列表参数列表); 如:float add(int x, int y );第10页/共40页 如果被调函数为自定义函数且其定义在主调函数定义之前,则在主调函数中可不必声明。 如果已在所有函数定义之前已作了函数声明,则在各主调函数中可不必对所调用的函数再作声明。如: char letter( ); float f( ); int i( ); main( ) / 不必说明它所调用的函数的类型 / 第11页/共40页1局部变量局部变量局部变量-在一个函数内部
7、定义的变量,只能在本函数内使用和有效。主函数main中定义的变量,也只能在主函数内使用和有效。不同的函数中可以使用相同名字变量,且互不干扰。形式参数也是局部变量,也只能在所在函数内使用和有效。可以在一个函数内的复合语句中定义变量,且这些变量只在本复合语句中有效。 这种复合语句也称为“分程序”或“子模块”。局部变量和全局变量局部变量和全局变量6.2 变量的作用域和存储类型第12页/共40页2全局变量全局变量全局变量(外部变量)-在函数(包括main函数)外定义的变量。其有效范围为从定义变量的位置开始到本源文件结束。 在文件开头定义的外部变量才可在整个文件范围内使用,若在定义点之前的函数需引用外部
8、变量,则可用关键字“extern”作“外部变量声明”。注意注意: 外部变量的定义只能有一次,它的位置在所有函数之外。而同一程序中的外部变量声明可以有多次,它的位置在函数之内(哪个函数要用就在哪个函数中说明)。系统根据外部变量的定义(而不是根据外部变量的说明)分配存储单元。对外部变量的初始化只能在“定义”时进行,“extern”只是申明该变量是一个已在外部定义过的变量而已。 如果在同一源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用。 第13页/共40页输出结果:输出结果:10, 4, 810, 2, 5例例#include stdio.hmain( ) int a=
9、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();第14页/共40页 内存中供用户使用的存储区由程序区、静态存储内存中供用户使用的存储区由程序区、静态存储区和动态存储区组成。区和动态存储区组成。 变量的存储类型有四种: 自动的(auto):内存的动态存储区 静态的(static) :静态存储区 寄存器的(register):寄存器静态变量在程序的运行期间占用固定的存储空间,直到程序的终止而释放;动态变量是在程序的运行期间随
10、着函数的调用随时动态地占用和释放存储空间。变量的存储类型变量的存储类型第15页/共40页局部变量的存储方式局部变量的存储方式1) 函数中的局部变量若未专门说明,这类局部变量称为自动变量,其类型说明前不论是否有关键字“auto”,都属于动态存储类别。2) 若希望被调函数在结束后,其局部变量占用的存储空间不释放,以便保留其变量的值,用于下次调用该函数,则用“static”说明为 “局部静态变量”。第16页/共40页 局部静态变量 在静态存储区分配存储单元,在程序的整个运行期间都不释放。 在编译时只赋初值一次,以后每次被调用时不再重新赋值而只保留前次被调用结束时的值。 若未赋初值,则在编译时自动赋初
11、值0 (数值型)或空字符(字符 型)。 虽然局部静态变量在函数被调用结束后其值仍然存在,但其它函数是不能引用的。动态变量 在动态存储区分配存储单元,函数调用结束后即释放。 赋初值不是在编译时而是在函数被调用时进行的,函数每次被调用时重新赋值。 若未赋初值,则其值是不确定的第17页/共40页例例 打印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)=1第23页/共40页long fac(int n) lo
12、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 因为置换展开是用置换展开是用“表达式表达式”对等对等的置换的置换“形参表形参表”中的参数中的参数。 定义带参数的宏,可以实现一些简单的
13、函数功能。如:如: #define MAX(x,y) (x)(y)?(x) : (y) main( )int a, b, c, t ; t = MAX(a+b, c+d); 第30页/共40页6.5.2 “文件包含文件包含” 用 #include 命令实现一个文件包含另一个文件。 语句形式: #include “文件名文件名”例例#include stdio.h#define N 2#define M N+1#define NUM (M+1)*M/2main( ) int i, n=0; for (i=1; i=NUM; i+) n+; printf(%2d, n); getch();输出结果
14、:输出结果:1 2 3 4 5 6 7 8第31页/共40页 一个include命令只能指定一个被包含文件,如果要包含n个文件,则要用n个include命令。 NUM被代换展开后为:( 2+1+1) 2+1/2 #include命令中,文件名既可用双引命令中,文件名既可用双引“ ”号号(推荐),推荐),也可用尖括号也可用尖括号括起来。括起来。表示被包含在标准目录表示被包含在标准目录中中(include).“”表示被包含文件在指定目录中,若只表示被包含文件在指定目录中,若只有文件名不带路径,则在当前目录中,若找不到,有文件名不带路径,则在当前目录中,若找不到,再到标准目录中找。再到标准目录中找。
15、 包含文件名可以是包含文件名可以是.c源文件或源文件或.头文件,如头文件,如#include #include “myhead.h”#include “D:myexammyfile.c”第32页/共40页6.12 条件编译条件编译语句形式:1#ifdef 宏名宏名程序段程序段1 #else程序段程序段2 #endif 作用:如果宏名已定义,则编译“程序段1”,否则编译“程序段2” 。 所谓“宏名已定义”是无论“宏名”定义为什么内容。 条件编译的作用:缩短编译时间,减少目标程序的长度。 第33页/共40页 作用:如果宏名未定义,则编译“程序段1” ,否则编译“程序段2”。3#if 表达式程序段1
16、 #else程序段2 #endif 作用:当“表达式”值为非0 ,则编译“程序段1” ,否则编译“程序段2”。2#ifndef 宏名 程序段1 #else 程序段2 #endif第34页/共40页 4#if 表达式1 程序段1 #elif 表达式2 程序段2 #else 程序段3 #endif 作用:当“表达式1”值为非0 ,则编译“程序段1” , 否则判断”表达式2”; 当“表达式2”的值为真,则编译“程序段2”,否则编译”程序段3”。第35页/共40页例例 #define TED 10main() #ifdef TED printf(Hi,Tedn); #else printf(HI,Anyonen); #endif #ifndef PALPH printf(RAPLH not definedn); #endif getch();第36页/共40页例main() #if MAX99 printf(compile for array greater than 99); #else printf(compile f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年信息系统分析与设计专业考试试卷及答案
- 2025年视觉传达设计学考试试卷及答案
- 2025年人力资源开发与管理考试试题及答案
- 2025年计算机软件工程师职业考试试卷及答案
- 2025年民族音乐学与文化研究考试试题及答案
- 2025年食品安全管理人员考试题及答案
- 2025年互联网产品经理入职测试题及答案
- 2025年工程施工管理师考试试卷及答案
- 先进半导体制造专用电子级硅烷供应协议
- 商业步行街商业街区物业管理与委托运营协议
- 中国现代文学思潮知到课后答案智慧树章节测试答案2025年春杭州师范大学
- 《基于大数据的银行信贷风险管理研究的国内外文献综述3200字》
- 2025年湖南省长沙市中考适应性试卷英语试题(原卷版+解析版)
- 社交媒体用户行为数据表格(新闻报道)
- 肺癌的科普知识
- 急性阑尾炎课件
- GB/T 45225-2025人工智能深度学习算法评估
- 2025年故宫博物院招聘事业编制工作人员历年高频重点模拟试卷提升(共500题附带答案详解)
- 全国高校辅导员素质能力大赛试题(谈心谈话、案例分析)
- 2025高级会计师(四套全真模拟)《高级会计实务》案例分析及答案
- 蒙医学在肿瘤治疗中的应用
评论
0/150
提交评论