制作:方斌 函数的返回值通过函数体中的 return【例一】 语句获得。 形式: return (x;return maino (x+y); return(xyx:y); d int max(float, float);/函数说明 语句中圆括号亦可省略。 float a=1.5,b=2.5: 【注意】如果函数值类型与 return语intc; 句表达式值的类型不一致,以函数类 型为准(数值型会自动进行类型转 C=max(a, b) 换)。如果明确表示不需返回值,可 printf( Max is%dⅦn"c) 用void作函数的数据类型。 } 【讨论】如何改错? max(float x, float y) 如果将输出语句中的%d改为%f,结/*用“值传递”分析法进行变量跟踪*/ 果: Max is0.125000(亦错) ·如果将max(X,y)改为foat d float z max(xy),结果编译出错: z=X>y?X:y; ype mismatch in redeclaration return z of max } 为什么?(原因见下)。 结果: Max is2(编译通过,结果错误)
制 作:方 斌 函数的返回值通过函数体中的return 语句获得。 形式: return (x); return (x+y); return (x>y?x:y); 语句中圆括号亦可省略。 【注意】如果函数值类型与return语 句表达式值的类型不一致,以函数类 型为准(数值型会自动进行类型转 换)。如果明确表示不需返回值,可 用void作函数的数据类型。 【例一】 main() { int max(float,float); /*函数说明*/ float a=1.5,b=2.5; int c; c=max(a,b); printf(“Max is %d\n”,c); } max(float x, float y) /*用“值传递”分析法进行变量跟踪*/ { float z; z=x>y?x:y; return z; } 结果:Max is 2 (编译通过,结果错误) 【讨论】如何改错? ·如果将输出语句中的%d改为%f,结 果: Max is 0.125000 (亦错) ·如果将max(x,y)改为float max(x,y),结果编译出错: Type mismatch in redeclaration of ‘max’ 为什么?(原因见下)
制作:方斌 8.3函数参数和函数的值 例8.2调用函数时的参数传递P146 、函数的参数 maino 函数的参数分为形参和 实参两种,作用是实现 int max(int,int)/*函数说明*/ 数据传送 int a, b, c scanf("%od, % od, %/ od", &a, &b, &c) 形参出现在函数定义中,c=max(a,b); 只能在该函数体内使用。 printf(" Max is%dn"c); 发生函数调用时,调用} 函数把实参的值复制一 int max( int X, int y)/*函数定义,其中int可省略*/ 份,传送给被调用函数 的形参,从而实现调用tz 函数向被调用函数的数=×>y2xy 据传送。 return Zi }
制 作:方 斌 8.3 函数参数和函数的值 一、函数的参数 函数的参数分为形参和 实参两种,作用是实现 数据传送。 形参出现在函数定义中, 只能在该函数体内使用。 发生函数调用时,调用 函数把实参的值复制一 份,传送给被调用函数 的形参,从而实现调用 函数向被调用函数的数 据传送。 例8.2 调用函数时的参数传递 P146 main() { int max(int,int) /*函数说明*/ int a,b,c; scanf("%d,%d,%d",&a,&b,&c); c=max(a,b); printf("Max is %d\n",c); } int max(int x,int y) /*函数定义,其中int可省略*/ { int z; z=x>y?x:y; return z; }
制作:方斌 [案例83]实参对形参的数据传递。 /*实参对形参的数据传递。*/ /*案例代码文件名:AL73.C*/ void maino d void s(int n); /*说明函数*/ int n=100: /*定义实参n,并初始化*/ s(n); /*调用函数* printi(C"ns=%dn′,n);/*输出调用后实参的值(100),便于进行比较* getchar o; void s(intn)/*函数定义*/ d int i; printf("n_x=%d\n,n); /*输出改变前形参的值:100*/ for(i=n-1;i>=1;i-)n--;/*改变形参的值* printf"n_X=%d\n",n); /*输出改变后形参的值:1*/ }
制 作:方 斌 [案例8.3] 实参对形参的数据传递。 /*实参对形参的数据传递。*/ /*案例代码文件名:AL7_3.C*/ void main() { void s(int n); /*说明函数*/ int n=100; /*定义实参n,并初始化*/ s(n); /*调用函数*/ printf(“n_s=%d\n”,n); /*输出调用后实参的值(100),便于进行比较*/ getchar(); } void s(int n) /*函数定义*/ { int i; printf(“n_x=%d\n”,n); /*输出改变前形参的值:100*/ for(i=n-1; i>=1; i--) n--; /*改变形参的值*/ printf(“n_x=%d\n”,n); /*输出改变后形参的值:1*/ }
制作:方斌 说明: (1)实参可以是常量、变量、表达式、函数等。无论实参是何种类 型的量,进行函数调用时,它们都必须具有确定的值,以便把这些值传 送给形参。 因此,应预先用赋值、输入等办法,使实参获得确定的值。 (2)形参变量只有在被调用时,才分配内存单元;调用结束时,即 刻释放所分配的内存单元。 因此,形参只有在该函数内有效。调用结束,返回调用函数后,则 不能再使用该形参变量。 (3)实参和形参占用不同的内存单元,即使同名也互不影响。 (4)实参与形参的数据类型应相同或赋值兼容。 (5)实参对形参的数据传送是单向的,即只能把实参的值传送给形 参,而不能把形参的值反向地传送给实参。在内存中,实参单元和形参 单元占有不同的单元
制 作:方 斌 说明: (1)实参可以是常量、变量、表达式、函数等。无论实参是何种类 型的量,进行函数调用时,它们都必须具有确定的值,以便把这些值传 送给形参。 因此,应预先用赋值、输入等办法,使实参获得确定的值。 (2)形参变量只有在被调用时,才分配内存单元;调用结束时,即 刻释放所分配的内存单元。 因此,形参只有在该函数内有效。调用结束,返回调用函数后,则 不能再使用该形参变量。 (3)实参和形参占用不同的内存单元,即使同名也互不影响。 (4)实参与形参的数据类型应相同或赋值兼容。 (5)实参对形参的数据传送是单向的,即只能把实参的值传送给形 参,而不能把形参的值反向地传送给实参。在内存中,实参单元和形参 单元占有不同的单元
制作:方斌 例: c=max(a,b)/*man(函数*/ max(intx,inty)/*max()函数*/ int Zi z=X>y?×:y; return; a2 b a 2 b 3 X2 y3 x5 8 a=2,b=3分别传值给形若在max(函数中改变了形 式参数x,y,则形式参 式参数x,y的值,但实际a,b 数的值x=2,y=3。 的值不变
制 作:方 斌 c=max(a,b) /*main()函数*/ max(int x,int y) /*max()函数*/ { int z; z=x>y?x:y; return z; } 例: a 2 b 3 x 2 y 3 a 2 b 3 x 5 y 8 a=2,b=3分别传值给形 式参数x,y,则形式参 数的值x=2,y=3。 若在max()函数中改变了形 式参数x,y的值,但实际a,b 的值不变