第8童 函数
第8章函数 本章内容 1.概述 2.函数定义的一般形式 3.函数参数和函数的值 函数的调用 5.函数的嵌套调用 6.函数的递归调用 7.数组作为函数的参数 8.局部变量和全局变量 9.变量的存储类别 10.内部函数与外部函数 11.运行一个多文件的程序
-2- 第8章 函数 本 章 内 容 1. 概述 2. 函数定义的一般形式 3. 函数参数和函数的值 4. 函数的调用 5. 函数的嵌套调用 6. 函数的递归调用 7. 数组作为函数的参数 8. 局部变量和全局变量 9. 变量的存储类别 10.内部函数与外部函数 11.运行一个多文件的程序
第8章函数 8.1概述 基本概念 ☆模块化 ■根据需求分析要求和功能抽象结果,把软件划分成若干个模 块,每个模块完成一个子功能。 ◆子程序 在高级语言中,模块化的实现通过子程序来的完成。 个程序由主程序和子程序组成,可以只有主程序而没有子 程序,但不能只有子程序而没有主程序。 ☆函数 ■在C语言中,子程序称为函数。 个C程序由一个主函数和若干个函数构成。即主函数调用其 他函数,其他函数可以互相调用。 例8.1:函数调用简单举例
-3- 第8章 函数 8.1 概述 基本概念 v 模块化 根据需求分析要求和功能抽象结果,把软件划分成若干个模 块,每个模块完成一个子功能。 v 子程序 在高级语言中,模块化的实现通过子程序来的完成。 一个程序由主程序和子程序组成,可以只有主程序而没有子 程序,但不能只有子程序而没有主程序。 v 函数 在C语言中,子程序称为函数。 一个C程序由一个主函数和若干个函数构成。即主函数调用其 他函数,其他函数可以互相调用。 例8.1:函数调用简单举例
第8章函数 8.1概述 说明 个源程序文件由一个或多个函数构成,称作一个编译单位,C程 序由若干个编译单位组成 ◇整个C程序有且仅有一个主函数main,程序由此开始,且调用完其 它函数后回到此结束。 ☆所有函数都是平行的,没有从属关系,函数不能嵌套定义,但可 以相互调用(main函数除外)。 ◇从用户角度,函数分为标准函数和自定义函数。 ☆从函数的形式,函数分为无参函数和有参函数: 无参函数 主调函数与被调函数之间无数据传递。一般以不带返回值居 多 有参函数 主调函数与被调函数之间可以有双向数据传递。可以有返回 值也可不带返回值
-4- 第8章 函数 8.1 概述 说明 v 一个源程序文件由一个或多个函数构成,称作一个编译单位,C程 序由若干个编译单位组成。 v 整个C程序有且仅有一个主函数main,程序由此开始,且调用完其 它函数后回到此结束。 v 所有函数都是平行的,没有从属关系,函数不能嵌套定义,但可 以相互调用(main函数除外)。 v 从用户角度,函数分为标准函数和自定义函数。 v 从函数的形式,函数分为无参函数和有参函数: 无参函数 主调函数与被调函数之间无数据传递。一般以不带返回值居 多。 有参函数 主调函数与被调函数之间可以有双向数据传递。可以有返回 值也可不带返回值
第8章函数 8.2函数定义的一般形式 无参函数的定义形式 类型标识符函数名0 说明部分 int max(int x, i y) 语句 int z 有参函数的定义形式 z=X>y? x: y 类型标识符函数名(形式参数表列) return Z, 说明部分 语句
-5- 第8章 函数 8.2 函数定义的一般形式 无参函数的定义形式 类型标识符 函数名() { 说明部分 语句 } 有参函数的定义形式 类型标识符 函数名(形式参数表列) { 说明部分 语句 } int max(int x, int y) { int z; z=x>y? x:y; return z; }
第8章函数 8.2函数定义的一般形式 空函数 类型标识符函数名Q 例如: 函数定义: Nothing[ 函数调用: Nothing0; E对形参声明的两种方式 ☆传统方式: 例: int max(x,y) int x,y; ◆现代方式: 例: int max(intx,inty)
-6- 第8章 函数 8.2 函数定义的一般形式 空函数 类型标识符 函数名() { } 例如: 函数定义:Nothing(){} 函数调用:Nothing(); 对形参声明的两种方式 v 传统方式: 例:int max(x, y) int x, y; { … } v 现代方式: 例:int max(int x, int y) { … }
第8章函数 8.3函数参数和函数的值 形参和实参 形参:定义时函数名后面括弧中的变量名称为形式参数。 ☆实参:调用时函数名后面括弧中的参数称为实际参数。 例8.2:调用函数时的数据传递 ma n int max(int x, int y) /*对max函数的声明*/ int a. b. c scanf("%d, %d", &a, &b) c max(a, b) printf( Max is %d", c) max(int x, int y) /*对mx函数的定义*/ int z. z=X>y? x: y; return(z)
-7- 第8章 函数 8.3 函数参数和函数的值 形参和实参 v 形参:定义时函数名后面括弧中的变量名称为形式参数。 v 实参:调用时函数名后面括弧中的参数称为实际参数。 v 例8.2: 调用函数时的数据传递 main() { int max(int x, int y); /*对max函数的声明*/ int a, b, c; scanf("%d, %d", &a, &b); c = max(a, b); printf("Max is %d", c); } max(int x, int y) /*对max函数的定义*/ { int z; z=x>y? x:y; return(z); }
第8章函数 8.3函数参数和函数的值 函数的返回值 ◇由 return语句获得。 ◆一个函数中可以一个以上的 return语句,执行到哪个 return语句, 哪一个 return语句起作用。 ☆ return语句返回的函数值类型应与定义函数时说明的函数值类型 致 当二者类型不一致时,以函数类型为准。例如: main o I float a,b max(float x, float y) int c float z scanf("%f, %f", &a, &b) z=X>y? x: y c=max(a, b) return Z: pr intf(" Max is‰dn",o);‖ 输入:1.5,3.5输出? ◆无 return语句则带回不确定的值。 ☆用void定义无类型,表示"不带回值
-8- 第8章 函数 8.3 函数参数和函数的值 函数的返回值 v 由return语句获得。 v 一个函数中可以一个以上的return语句,执行到哪个return语句, 哪一个return语句起作用。 v return语句返回的函数值类型应与定义函数时说明的函数值类型 一致。 v 当二者类型不一致时,以函数类型为准。例如: 输入:1.5, 3.5 输出? v 无return语句则带回不确定的值。 v 用void定义无类型,表示"不带回值" 。 main() { float a, b; int c; scanf("%f, %f", &a, &b); c=max(a, b); printf("Max is %d\n ", c); } max(float x, float y) { float z; z=x>y? x:y; return z; }
第8章函数 8.4函数的调用 函数调用的一般形式 函数名(实参表列); 说明 ◆调用无参函数时,无″实参形列",但括弧不能省略。 ◆实参个数与形参个数相等,对应参数的类型应一致。 令多个实参时,对实参求值的顺序依系统而定。 Turbo C按自右而左 序求值 例8.4:实参求值的顺序:不是确定的 0 nt flint a, int b ma In int i=2, p if(a>b)c=1 p=f(i,++i); else if(a==b)c=o pr intf("‰d",p); ese c=-1 return C: 分析结果? ☆如果实现调用时从左至右求实参值?
-9- 第8章 函数 8.4 函数的调用 函数调用的一般形式 函数名(实参表列); 说明: v 调用无参函数时,无"实参形列" ,但括弧不能省略。 v 实参个数与形参个数相等,对应参数的类型应一致。 v 多个实参时,对实参求值的顺序依系统而定。Turbo C按自右而左 的顺序求值。 例8.4: 实参求值的顺序:不是确定的 v 分析结果? v 如果实现调用时从左至右求实参值? main() { int i=2, p p=f(i, ++i); printf("%d", p); } int f(int a, int b) { int c; if(a>b) c=1; else if(a==b) c=0; else c=-1; return c; }
第8章函数 8.4函数的调用 函数调用的三种方式 函数语句 例如: pr instar0 主要用来执行某一操作,无返回值 ☆函数表达式 例如:c=2*max(a,b); 函数出现在一个表达式中,要求带回一个确定的返回值。 函数参数 例如:m=max(a,max(b,c); pr intf("%d", max(a, b)) ■函数调用作为一个函数的实参,要求带回一个确定的返回值。 10
-10- 第8章 函数 8.4 函数的调用 函数调用的三种方式 v 函数语句 例如:printstar(); 主要用来执行某一操作,无返回值。 v 函数表达式 例如:c=2*max(a, b); 函数出现在一个表达式中,要求带回一个确定的返回值。 v 函数参数 例如:m=max(a, max(b, c)); printf("%d", max(a, b)); 函数调用作为一个函数的实参,要求带回一个确定的返回值