清华大学出版社 JSINGHUA UNIVERSY PHESS 第8章函数 81概述 82函数定义的一般形式 83函数参数和函数的值 84函数的调用 8.5函数的嵌套调用 86函数的递归调用 8.7数组作为函数参数 88局部变量和全局变量 89变量的存储类别 810内部函数和外部函数 811如何运行一个多文件的程序 习题
8.1 概述 8.2 函数定义的一般形式 8.3 函数参数和函数的值 8.4 函数的调用 8.5 函数的嵌套调用 8.6 函数的递归调用 8.7 数组作为函数参数 8.8 局部变量和全局变量 8.9 变量的存储类别 8.10 内部函数和外部函数 8.11 如何运行一个多文件的程序 习题 第8章 函 数
清华大学出版社 TSINGHUA UNIVERSITY PRESS 81概述 一个较大的程序一般应分为若干个程序模块,每 个模块用来实现一个特定的功能。所有的高级语 言中都有子程序这个概念,用子程序实现模块的 功能。在C语言中,子程序的作用是由函数完成 的。一个C程序可由一个主函数和若干个函数构 成。由主函数调用其他函数,其他函数也可以互 相调用。同一个函数可以被一个或多个函数调用 任意多次。图8.1是一个程序中函数调用的示意图
8.1 概述 一个较大的程序一般应分为若干个程序模块,每一 个模块用来实现一个特定的功能。所有的高级语 言中都有子程序这个概念,用子程序实现模块的 功能。在C语言中,子程序的作用是由函数完成 的。一个C程序可由一个主函数和若干个函数构 成。由主函数调用其他函数,其他函数也可以互 相调用。同一个函数可以被一个或多个函数调用 任意多次。图8.1是一个程序中函数调用的示意图
清华大学出版社 TSINGHUA UNIVERSITY PRESS 在程序设计中,常将一些常用的功能模块编写成函 数,放在函数库中供公共选用。要善于利用函数, 以减少重复编写程序段的工作量 先举一个简单的函数调用的例子。例8.1 main printstar();/*调用 printstar函数* print- message();/*调用 print message*/ printstar();/*调用 printstar函数* printstar()/* printstarl函数*
在程序设计中,常将一些常用的功能模块编写成函 数,放在函数库中供公共选用。要善于利用函数, 以减少重复编写程序段的工作量。 先举一个简单的函数调用的例子。例8.1 main() {printstar();/* 调用printstar函数 */ print-message();/* 调用print message */ printstar(); /* 调用printstar函数 */ } printstar() /*printstar函数*/ {
清华大学出版社 TSINGHUA UNIVERSITY PRESS printf "兴兴共为兴兴兴兴兴\n") main print-message ( * print-message函数*/ printf ("How do you do! n") 图8 运行情况如下: zkkκk;κkκκ;κκκ How do you do! kk;:tκκκ;:κκκ
printf("* * * * * * * * * * * * * * * * * *\n"); } print-message() /* print-message函数*/ { printf("How do you do!\n"); } 运行情况如下: * * * * * * * * * * * * * * * * * * How do you do! * * * * * * * * * * * * * * * * * * 图8.1
清华大学出版社 TSINGHUA UNIVERSITY PRESS printstar和 print- message都是用户定义的函数名,分 别用来输出一排“*”号和一行信息。 说明: (1)一个源程序文件由一个或多个函数组成。一个源 程序文件是一个编译单位,即以源程序为单位进行 编译,而不是以函数为单位进行编译。 (2)一个C程序由一个或多个源程序文件组成。对较 大的程序,一般不希望全放在一个文件中,而将函 数和其他内容(如预定义)分别放在若干个源文件 中,再由若干源文件组成一个C程序。这样可以分 别编写、分别编译,提高调度效率。一个源文件可 以为多个C程序公用
printstar和print-message都是用户定义的函数名,分 别用来输出一排“*”号和一行信息。 说明: (1) 一个源程序文件由一个或多个函数组成。一个源 程序文件是一个编译单位,即以源程序为单位进行 编译,而不是以函数为单位进行编译。 (2) 一个C程序由一个或多个源程序文件组成。对较 大的程序,一般不希望全放在一个文件中,而将函 数和其他内容(如预定义)分别放在若干个源文件 中,再由若干源文件组成一个C程序。这样可以分 别编写、分别编译,提高调度效率。一个源文件可 以为多个C程序公用
清华大学出版社 TSINGHUA UNIVERSITY PRESS (3)C程序的执行从main函数开始,调用其他函数后 流程回到main函数,在main函数中结束整个程序的 运行。mai函数是系统定义的 (4)所有函数都是平行的,即在定义函数时是互相独 立的,一个函数并不从属于另一函数,即函数不能 嵌套定义(这是和 PASCAL不同的),函数间可以 互相调用,但不能调用main函数。 (5)从用户使用的角度看,函数有两种: ①标准函数,即库函数。这是由系统提供的,用户不 必自己定义这些函数,可以直接使用它们。应该说 明,不同的C系统提供的库函数的数量和功能不同, 当然有一些基本的函数是共同的
(3) C程序的执行从main函数开始,调用其他函数后 流程回到main函数,在main函数中结束整个程序的 运行。main函数是系统定义的。 (4) 所有函数都是平行的,即在定义函数时是互相独 立的,一个函数并不从属于另一函数,即函数不能 嵌套定义(这是和PASCAL不同的),函数间可以 互相调用,但不能调用main函数。 (5) 从用户使用的角度看,函数有两种: ① 标准函数,即库函数。这是由系统提供的,用户不 必自己定义这些函数,可以直接使用它们。应该说 明,不同的C系统提供的库函数的数量和功能不同, 当然有一些基本的函数是共同的
清华大学出版社 TSINGHUA UNIVERSITY PRESS ②用户自己定义的函数。用以解决用户的专门需要 (6)从函数的形式看,函数分两类: ①无参函数。如例8.1中的 printstar和 print-message就 是无参函数。在调用无参函数时,主调函数并不将数 据传送给被调用函数,一般用来执行指定的一组操作 (例如,例8.1那样), printstar函数的作用是输出18 个星号。无参函数可以带回或不带回函数值,但一般 以不带回函数值的居多 ②有参函数。在调用函数时,在主调函数和被调用函 数之间有数据传递。也就是说,主调函数可以将数据 传给被调用函数使用,被调用函数中的数据也可以带 回来供主调函数使用
② 用户自己定义的函数。用以解决用户的专门需要。 (6) 从函数的形式看,函数分两类: ① 无参函数。如例8.1中的printstar和print-message就 是无参函数。在调用无参函数时,主调函数并不将数 据传送给被调用函数,一般用来执行指定的一组操作 (例如,例8.1那样),printstar函数的作用是输出18 个星号。无参函数可以带回或不带回函数值,但一般 以不带回函数值的居多。 ② 有参函数。在调用函数时,在主调函数和被调用函 数之间有数据传递。也就是说,主调函数可以将数据 传给被调用函数使用,被调用函数中的数据也可以带 回来供主调函数使用
清华大学出版社 TSINGHUA UNIVERSITY PRESS 82函数定义的一般形式 1.无参函数的定义形式 类型标识符函数名() 声明部分 语句 例8.1中的 printstar和 print- message函数都是 无参函数。用“类型标识符”指定函数值的类 型,即函数带回来的值的类型。无参函数一般 不需要带回函数值,因此可以不写类型标识符, 例8.1就如此
类型标识符 函数名() {声明部分 语句 } • 例8.1中的printstar和print-message函数都是 无参函数。用“类型标识符”指定函数值的类 型,即函数带回来的值的类型。无参函数一般 不需要带回函数值,因此可以不写类型标识符, 例8.1就如此。 8.2 函数定义的一般形式 1. 无参函数的定义形式
清华大学出版社 TSINGHUA UNIVERSITY PRESS 2.有参函数定义的一般形式 类型标识符函数名(形式参数表列) 声明部分 语句 例如: int max (int x, int y) {intz;/*函数体中的声明部分 z =x>y? x: y return(z
类型标识符函数名(形式参数表列) {声明部分 语句 } 例如: int max(int x,int y) {int z;/* z=x>y?x∶y; return(z); } 2. 有参函数定义的一般形式
清华大学出版社 TSINGHUA UNIVERSITY PRESS 这是一个求x和y二者中大者的函数,第1行第一个关 键字in表示函数值是整型的。max为函数名。括 号中有两个形式参数x和y,它们都是整型的。在 调用此函数时,主调函数把实际参数的值传递给 被调用函数中的形式参数x和y。花括弧内是函数 体,它包括声明部分和语句部分。在声明部分定 义所用的变量,此外对将要调用的函数作声明 (见843节)。在函数体的语句中求出z的值 (为x与y中大者), return(z的作用是将z的值作 为函数值带回到主调函数中。 return后面的括弧中 的值(作为函数带回的值(或称函数返回值) 在函数定义时已指定max函数为整型,在函数体中 定义z为整型,二者是一致的,将z作为函数max 的值带回调用函数(见例8.2)
这是一个求x和y二者中大者的函数,笫1行第一个关 键字int表示函数值是整型的。max为函数名。括 号中有两个形式参数x和y,它们都是整型的。在 调用此函数时,主调函数把实际参数的值传递给 被调用函数中的形式参数x和y。花括弧内是函数 体,它包括声明部分和语句部分。在声明部分定 义所用的变量,此外对将要调用的函数作声明 (见8.4.3节)。在函数体的语句中求出z的值 (为x与y中大者),return(z)的作用是将z的值作 为函数值带回到主调函数中。return后面的括弧中 的值(z)作为函数带回的值(或称函数返回值)。 在函数定义时已指定max函数为整型,在函数体中 定义z为整型,二者是一致的,将z作为函数max 的值带回调用函数(见例8.2)