第八章函数 ■8.1函数概述 ■8.2函数定义的一般形式 ■8.3函数参数和函数的值 ■8.4函数的调用 ■8.5函数的嵌套调用 8.6函数的递归调用 ■8.7数组作为函数参数 ■8.8局部变量和全局变量
第八章 函数 ◼ 8.1 函数概述 ◼ 8.2 函数定义的一般形式 ◼ 8.3 函数参数和函数的值 ◼ 8.4 函数的调用 ◼ 8.5 函数的嵌套调用 ◼ 8.6 函数的递归调用 ◼ 8.7 数组作为函数参数 ◼ 8.8 局部变量和全局变量
81函数概述 #include 有关C函数的介绍 void main( 个源程序文件由一个{inta,b,c 或多个函数组成 scanf(“%d%d”,&a,&b) 2.一个C程序由一个或多个 c=arabs(b) 源程序文件组成 printf("c=%dn”,c); 3.C程序从maim函数开始执行,} 调用其他函数后再返回到main函数 4.所有函数都是平行的,定义函数时是互相独立的, 函数之间可以互相调用,但是不能调用main函数
8.1 函数概述 一、有关C 函数的介绍 1. 一个源程序文件由一个 或多个函数组成 2. 一个C程序由一个或多个 源程序文件组成 3. C程序从main函数开始执行, 调用其他函数后再返回到main 函数 4. 所有函数都是平行的, 定义函数时是互相独立的, 函数之间可以互相调用, 但是不能调用main函数 #include #include void main( ) { int a, b, c; scanf(“%d%d”, &a, &b) ; c=a+abs(b); printf(“c=%d\n”, c); }
、C函数的分类 1.从用户使用角度分为:标准函数和用户自定义函数 2从函数的形式分为无参函数和有参函数函数定义 include #include stdio.h> void list(void int max (int x, int y) i int z printf(“***n”); if(x>y)z=x;形式参数 else zy return(z; void main( list(; prin(“ good I实在参数 void main( 函数调用 f int a,b, c; ist(;/用户自定义 ia(“%d%&a,&b); 函数 c=max(a, b), printf("max=%d”,);
二、C 函数的分类 1. 从用户使用角度分为: 标准函数和用户自定义函数 2. 从函数的形式分为: 无参函数和有参函数 #include int max(int x, int y) { int z ; if (x>y) z=x ; else z=y ; return(z) ; } void main( ) { int a ,b ,c ; scanf(“%d%d”,&a,&b); c=max(a,b); printf(“max=%d”,c); } 函数定义 函数调用 形式参数 #include void main( ) { printf(“******\n”); printf(“ good \n”); printf(“******\n”); } /*printf是标准函数*/ #include void list(void) { printf(“******\n”); } void main( ) { list( ) ; printf(“ good \n”); list ( );/*用户自定义 函数*/ } 实在参数
82函数定义的一般形式 1.定义格式:函数类型函数名(形式参数表 函数体; 2.说明 (1)函数名:用户定义的合法标识符 (2)函数的类型:函数返回值的类型 若返回值为int或char类型,函数定义时可省略不写 若函数无返回值,函数定义时应写上vod类型 void list(void) { printf(“**n”);}
8.2 函数定义的一般形式 1. 定义格式 : 函数类型 函数名 ( 形式参数表) { 函数体 ; } 2. 说明 (1) 函数名 : 用户定义的合法标识符 (2) 函数的类型: 函数返回值的类型 若返回值为int 或char 类型, 函数定义时可省略不写 若函数无返回值, 函数定义时应写上void 类型 void list(void) { printf(“******\n”); }
(3)形式参数 ①书写格式:每一个参数都要写上数据类型和参数名 参数之间以逗号分隔,无参数时一般写上void声明它为空 ②作用:表示将从主函数中接收哪些类型的信息 例: int max(intx,inty) int z, z-X>y:X: y; return(z (4)函数体:由变量声明和语句组成 ①函数体内定义的变量是局部量,只在执行该函数时存在 ②函数体可以为空即存在空函数) void f(void){}
(3) 形式参数 ① 书写格式 : 每一个参数都要写上数据类型和参数名 参数之间以逗号分隔, 无参数时一般写上void 声明它为空 ② 作用 : 表示将从主函数中接收哪些类型的信息 例 : int max( int x , int y ) { int z ; z = x > y ? x : y ; return( z ) ; } (4) 函数体 : 由变量声明和语句组成 ① 函数体内定义的变量是局部量, 只在执行该函数时存在 ② 函数体可以为空(即存在空函数) void f (void) { }
83函数参数和函数的值 、形式参数和实在参数 1.形式参数:在定义函数时写在函数名后面的括号内的变量 2.实在参数:在调用函数时写在函数名后面的括号内的变量 3.说明 (1)程序在编译时不为形参分配存储空间,只有当函数 被调用时,形参被分配存储空间,在调用结束后,形参 所占的空间被释放 (2)实参可以是常量,变量或表达式 (3)实参和形参的类型应相同或赋值相容 (4)实参对形参的数据传递是“值传递”,即单向传递 实参→形参
8.3 函数参数和函数的值 一、形式参数和实在参数 1. 形式参数 : 在定义函数时写在函数名后面的括号内的变量 2. 实在参数 : 在调用函数时写在函数名后面的括号内的变量 3. 说明 (1) 程序在编译时不为形参分配存储空间, 只有当函数 被调用时, 形参被分配存储空间, 在调用结束后, 形参 所占的空间被释放 (2) 实参可以是常量, 变量或表达式 (3) 实参和形参的类型应相同或赋值相容 (4) 实参对形参的数据传递是“值传递” , 即单向传递 实参 → 形参
、函数的返回值 1.函数的返回值通过函数中 return语句获得 return语句的作用:使流程返回主调函数; 将函数值送回到调用表达式中 2.函数类型决定函数返回值的类型 一般函数值的类型和 return语句中表达式的类型应一致 如果二者不一致,则以函数值的类型为准 3.有的函数中没有 return语句,因为它不需要带回值,这时 可以将函数类型定义为void型 void list(void) printf( 6六出出出出出
二、 函数的返回值 1. 函数的返回值通过函数中return语句获得 return语句的作用: 使流程返回主调函数; 将函数值送回到调用表达式中 2. 函数类型决定函数返回值的类型 一般函数值的类型和return语句中表达式的类型应一致 如果二者不一致, 则以函数值的类型为准 3. 有的函数中没有return语句, 因为它不需要带回值, 这时 可以将函数类型定义为 void 型 void list(void) { printf(“******\n”); }
4.一个函数允许有一个或多个 return语句,但每个 return 后的表达式类型要相同;当执行到其中任何一个 return 语句时会立即返回主调函数 int fun(int n if(n>10) return(n); else return(2n);
4. 一个函数允许有一个或多个return语句, 但每个return 后的表达式类型要相同; 当执行到其中任何一个return 语句时会立即返回主调函数 int fun( int n ) { if ( n >10 ) return( n ) ; else return( 2*n ) ; }
84函数的调用 函数调用 1.一般形式:函数名(实参表列); 2.说明 (1)实参表列可以包含多个实参,各个实参之间用逗号分隔 (2)实参与形参的个数应相等,类型一致,顺序要一一对应 (3)调用无参函数时格式为:函数名()注意()不能省略 (4)BC31中按从左至右的顺序对实参求值 3.函数调用的方式 (1)函数语句prin(“heo!”);/标准函数调用*/ (2)函数表达式c=2*max(a,b);体自定义函数调用* (3)函数参数m=max(c,max(a,b))
8.4 函数的调用 一、函数调用 1. 一般形式 : 函数名( 实参表列 ) ; 2. 说明 (1) 实参表列可以包含多个实参, 各个实参之间用逗号分隔 (2) 实参与形参的个数应相等, 类型一致, 顺序要一一对应 (3) 调用无参函数时格式为: 函数名( ) 注意( )不能省略 (4) BC31中按从左至右的顺序对实参求值 3. 函数调用的方式 (1) 函数语句 printf(“hello!”) ; /*标准函数调用*/ (2) 函数表达式 c = 2 * max( a , b ) ; /*自定义函数调用*/ (3) 函数参数 m = max ( c , max ( a , b ) ) ;
4函数调用过程: (1)形参与实参各自占有一个独立的存储空间 (2)形参的存储空间在函数被调用时才分配 (3)函数返回时,形参占据的临时存储区被撤消 特点:函数中对形参变量的操作不会影响到实参 #include int f(int x, int y) 假设输入为:35 {x=x+2; y=y*2; mai函数 f函数 return( x+y 3 void main O i int a, b, c b 5 scanf(“%d%d”,&a,&b); c=f(a, b)i printf(%odt”,c) 15 printf( ood, /od n", a, b); 运行结果为:15 3.5
4. 函数调用过程: (1) 形参与实参各自占有一个独立的存储空间 (2) 形参的存储空间在函数被调用时才分配 (3) 函数返回时, 形参占据的临时存储区被撤消 特点 : 函数中对形参变量的操作不会影响到实参 #include int f (int x , int y) { x = x+2 ; y = y*2 ; return( x+y ) ; } void main ( ) { int a , b , c ; scanf(“%d%d” , &a , &b) ; c = f(a , b) ; printf(“%d\t” , c) ; printf(“%d,%d\n”,a,b); } 假设输入为: 3 5 main函数 f 函数 a b c x y 3 5 3 5 5 10 15 运行结果为:15 3 , 5