chap7 函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.2 函数的定义和返回值
1.函数的定义方法 (1)C语言函数定义的一般形式: 存储类型说明符 函数返回值类型名 函数名(类型名 形参1, 类型名 形参2,……) *函数首部*/ {说明部分 执行部分 } ① 存储类型说明符说明该函数是内部函数还是外部函数。 ② 函数返回值类型名是用来说明该函数返回值的类型,如果 没有返回值,则其类型说明符应为“void”。
• 以下程序执行后的输出结果是() fun(int x, int y) {return (x+y) ;} main() { int a=1, b=2, c=3, sum ; sum = fun((a++,b++,a+b),c++); printf(“%d\n”,sum); }
7.4 函数说明 7.4.1 函数说明的形式 在C语言中,要调用某个函数,需对该函数进 行函数说明(或称为函数原型说明)。函 数说明的一般形式为: 类型名 函数名(参数类型1,参数类型 2,…)或 类型名 函数名(参数类型1 参数名1,参数 类型2 参数名2,…)
ቤተ መጻሕፍቲ ባይዱ
7.3.2 函数调用时的语法要求 函数调用时,需要遵循以下几条语法要求: (1)调用函数时,函数名必须与所调用的函数名字完全一 致。 (2)实参的个数必须与形参一致。实参可以是表达式,在 类型上应按位置与形参一一对应匹配。如果类型不匹配, C编译程序按赋值兼容的规则进行转换,否则,程序运行 后不能得到正确的结果。 (3)C语言规定,函数必须先定义后调用(函数的返回值类 型为int或char时除外)。 (4)实参可以是 C程序中函数可以直接或间接的自己调用 自己,即递归调用。 重点提示: ※重点提示:函数调用时,必须特别注意实参和形参的类型 匹配。
3.函数定义举例
(1)定义一个函数,其功能是对三个实型参数求最大值,并返回这个值。 float max(float f1,float f2,float f3) /*定义函数返回值的类型、函数名和 形式参数*/ { float m1; /*函数体的说明部分*/ if (f1>f2) m1=f1; /*以下是函数体的执行部分*/ else m1=f2; if(m1<f3) m1=f3; return(m1); /*通过return(表达式)返回一个确定的值*/ }
7.3 函数的调用
7.3.1 函数调用的两种形式 1.有返回值的函数的调用形式 有返回值的函数调用,可以作为表达式或表达式的一部分, 也可以作为一条语句。其调用形式是: 函数名(实际参数列表) ( ) , , 调用的结果是获得一个返回值,该返回值可以参加相应类 型的计算。 如:sum(x,y)是一函数,可以由以下两种调用方式 y=2+sum(3,4);(作为表达式的一部分,参与计算) 或sum(3,4);(单独作为一条语句,不使用返回值)
2.库函数
C语言提供了丰富的库函数,包括常用的数学函数, 字符、字符串处理函数,输入输出函数等,用户在 编写程序时可以直接调用这些已有的库函数。以下 是关于库函数调用的几点说明: (1)调用C语言标准库函数时要求用include命令 对每一类库函数,都有其相应的头文件名,调用某 个库函数时,用户在源程序中须用include命令包含 其头文件名。一般形式为: #include <头文件名.h> 或#include “头文件 名.h”
在C语言中,函数返回值的类型最终取决 于() A) 函数定义时的函数首部所说明的函数类 B) return语句中表达式值的类型 C) 调用函数时主调函数所传递的实参类型 D) 函数定义时实参的类型 •
• 若各选项总所用变量已正确定义,函数fun 中通过return语句返回一个函数值,以下选 项中错误的是() A) main() { ... x=fun(2,10) ;...} float fun(int a, int b){...} B) float fun(int a, int b){...} main() {... x=fun(i,j)...} C) float fun(int, int); main() {...x=fun(2,10);...} floate fun(int a, int b){...} D) main() {float fun(int i, int j); ... x= fun(i,j);...} float fun(int a, int b) {...}
第7章 函数
本章要点: 本章要点 7.1 库函数 7.2 函数的定义和返回值 7.3 函数的调用 7.4 函数的说明 7.5 调用函数和被调用函数之间的数据 传递
7.1 库函数
1.函数的概念 函数从本质上来说就是完成一定功能程序段, 有一个名字叫函数名。若有其它程序要完成该函 数的功能,可通过函数名调用它,函数可多次反 复调用。引入函数主要是解决两个问题:一是为 了解决代码的重复。如有一个程序段在程序中要 出现很多次,每次都要写出来既非常麻烦又使程 序显得很长,此时就可以把该程序段定义成一个 函数,在使用该程序段的地方直接调用该函数就 可以了;二是结构化、模块化编程的需要。
2.无返回值的函数调用形式 无返回值的函数调用只能作为一条语句,其 调用形式如下: 函数名(实际参数列表);(注意,这里的分号 必不可少) 如:max(a,b,c);
3.函数调用执行过程 其实在执行函数调用时,系统要完成一系列复杂的过程: 首先为被调函数的所有形式参数分配内存,再计算实际参 数的值,再一一对应地赋给相应的形式参数(对于无参函 数,不做该项工作);然后进入函数体,为函数说明部分 定义的变量分配存储空间,再依次执行函数体中的可执行 语句;当执行到“return(表达式)”语句时,计算返回值(如 果是无返回值的函数,不做该项工作),收回本函数中定 义的变量所占用的存储空间(对于static类型的变量,其空 间不收回),返回主调函数继续执行。 ※重点提示:有返回值的函数调用,可以作为表达式或表 重点提示 达式的一部分,也可以作为一条语句。而无返回值的函数 调用只能作为一条语句。
(5)当被调函数和主调函数在同一个程序文件中, 可在主调函数的函数体说明部分对被调函数进行 说明,说明格式有两种,如下: 类型名 被调函数名() 或 类型名 被调函数名(形式参数列表) (6)函数说明可以是一条独立的语句,也可以与普 通变量一起出现在同一个定义语句中。如double sub(float,double)和double x,y,sub(float, double)都是合法的。 ※重点提示:内部函数的说明包含在.h文件中,故 重点提示 调用某个内部函数,必须包含相应的头文件。
以下是函数说明的几条规则: (1)调用系统函数时,需要在程序的开头包含相应的 头文件。但scanf()和printf()等少数的几个函数不需 要。 (2)当被调函数定义在主调函数之前时,对被调函数 的说明可以省去,也可以不省。 (3)当被调函数的返回值类型是整形或字符型时,不 管其定义在主调函数之前还是之后,对被调函数的 说明都可以省去,也可以不省。 (4)其它情况一律需要对被调函数进行说明。
③ 第一行通常称为函数首部,通过它就能知道函数的功能及 调用方式。 ④ 其它部分称函数体。函数体包括两个部分,说明部分和执 行部分,说明部分通常用来定义在本函数中使用的变量、数 组等,执行部分是函数功能的实现,通常由一系列的可执行 语句构成。 (2)无参函数的定义格式 存储类型说明符 数据类型说明符 函数名( ) /*函数头*/ {说明部分 执行部分 } 说明: 无参函数与有参函数基本一样,不同的只是它没有形式参数, 调用时不需实参。
2.函数的返回值 函数值通过return语句返回,return语句的一般 形式为: return 表达式; 或 return (表达式) 或 return; 以下是几点说明: (1)return语句中表达式的值就是所求的函数 值,且其类型必须与函数首部所说明的类型一 致。若类型不一致,则由系统自动转换为函数 值的类型。
建立函数的过程称“函数的定义”,在程序中使用 函数称“函数的调用”。被调用的函数称“被调 函数”,而调用函数的函数称“主调函数”。在 C程序中,main()可以调用任何非主函数,非主函 数可以调有非主函数也可被其它函数调用但不能 调用main()函数,也就是说main()只能作用主调 函数。一般情况下,函数对数据进行加工,最后 得到一个结果作为函数的返回值。 根据不同的方法,函数可以分成不同的种类。如从 使用的角度来看,可以把函数分成用户函数和系 统函数;从定义时有无参数来分,可分为有参函 数和无参函数;根据函数调用时是否有返回值来 分,可分为有返回值的函数和无返回值的函数; 根据函数的作用范围来分,可分成内部函数和外 部函数。
(2)在程序执行到return语句时,流程就返回 到调用该函数处,并带回函数值。在同一个函数 内,可以在多处出现return语句。 (3)return语句也可以不含表达式。此时,它 只是使流程返回到调用函数,并没有确定的函数 值。 (4)函数体内可以没有return语句,程序就一 直执行到函数末尾,然后返回调用函数,此时也 没有确定的函数值带回。
(2)标准库函数的调用 库函数调用的一般形式为: 函数名(参数表) C语言中库函数的调用有两种方式: ①在表达式中调用。如: x=pow(2),就是在赋值表达式中调用pow函 数来求x的值。 ②作为独立的语句完成某种操作。如: printf(“***&&&\n”);
就是调用了printf函数,且调用之后加了分号, 构成了一条独立的语句,完成该输出操作。 (3)各个库函数的功能、参数的个数和类型、 函数值的类型都有其规定,用户在调用时 根据需要选择合适的库函数,并严格按照 该库函数的规则,正确的进行调用。 ※重点提示:库函数的调用需要注意的是: 重点提示 函数的功能,函数的参数个数、类型,函 数的返回值,对参数的一些特殊要求。
7.4.2 函数说明的位置 当在函数的外部、被调用之前说明函数时, 在函数说明的后面所有位置上都可以对该函 数进行调用。 函数说明也可以放在调用函数内的说明部分, 如在main函数内部进行说明,则只能在 main函数内部才能识别函数。 ※重点提示:函数调用时,必须特别注意实 重点提示: 参和形参的类型匹配。
• 在main函数中调用welc()函数10次 main() { int i; for (i=1; i<=10; i++) welc(); } void welc() {...} 编译错误
※重点提示: 重点提示 要想让函数返回一个确定的值,必须通过语 句“return(表达式)”来实现,其中表达式就是 函数的返回值。如果没有return语句,或 return语句不带表达式并不表示没有返回值, 而是表示返回一个不确定的值。如果不希望 有返回值,必须在定义函数时把“数据类型 说明符”说明为“void”。
(2)无参函数定义示例:定义一个函数,其作用是打印出 五行欢迎词“Welcome you, my dear friends”。 void welc()/*定义函数返回值的类型(为“void”说明无返回值) 及函数名*/ { int i; /*函数体的说明部分*/ for(i=1;i<=5;i++) /*以下是函数体的执行部分*/ printf(“Welcome, my dear friends”); } 说明:该函数的类型说明为“void”,所以为无返回值的函数, 函数中不需要return语句。
3)关于函数定义的几点说明 ① C语言规定,不能在同一个函数内部再定义函数。 ② 函数名和形式参数都是由用户命名的标识符。在 同一程序中,函数名必须唯一,形式参数名只要 在同一函数中即可,可以与其他函数中的变量同 名。 ③ 若省略了函数返回值的类型名,则C默认函数返 回值的类型为int类型。 ④ 形参可以省略,称为无参函数。在调用时不需实 参。即 存储类型说明符 函数返回值类型名 函数名() ⑤ 函数体中,除形参外,用到的其它变量必须在说 明部分进行定义,且可以和其他函数中的变量同 名。