当前位置:文档之家› C语言chap6(函数与宏定义)

C语言chap6(函数与宏定义)


6.5 函数的嵌套调用
C 语言函数的定义都是相互平行、独立的,不能 嵌套定义。但可以嵌套调用函数。所谓函数的嵌套调 用就是在被调用的函数中又调用另外的函数。
6.6 函数的递归调用
在调用一个函数的过程中又出现直接或间接地调 用该函数本身,称为函数的递归调用。
2012-6-12
13
例6.4 有5人排成一队,从最后一人开始,其年龄均比 前面的人大2岁,而最前面的人年龄是10岁,问最后 一人的年龄是多少岁?
age(1)=12
2012-6-12
14
函数的递归调用利用了堆栈技术。在本例中: Age(4–1)+2 Age(3–1)+2 Age(2–1)+2 Age(5–1)+2 Age(5)
Age(2–1)+2
Age(3–1)+2
Age(2–1)+2
Age(3–1)+2
10+2=12
12+2=14
Age(4–1)+2
int max(int x, int y);
float fun(int a[10], int n);
2012-6-12 5
2.函数的返回值 函数的返回值是通过return语句获得的。当不需返回 函数值时,可省去return语句。
return语句的后面可以有括号,也可以没有。如:
return z ; return(z); return(x >y ? x : y); return语句返回值的类型应与该函数的类型一致。否 则以函数类型为准。
2012-6-12 11
例6.3 编程求11~999之间的数m,而m、m2和m3均是回文数(数 位左右对称)。 如:m=11、m2=121、m3=1331,…… 。 #include “stdio.h” main( ) {long int m; for (m=11; m<1000; m++) if (fun(m)&&fun(mm)&&fun(mmm)) printf("m=%ld,\t mm=%ld,\t mmm=%ld\n", m, mm, mmm); } int fun(long n) {long i, k; i= n; k=0; while (i) { k=i%10+k10; i = i /10; } if (k==n) return 1; else return 0; } 2012-6-12 12
全局变量增加了函数间数据联系的渠道。由于同一文件中的所 有函数都能引用全局变量的值,当需要从一个函数中带回多个值 时,就能克服函数调用只能返回一个值的局限性。 如无必要,不要使用全局变量。因为全局变量既降低程序的清 晰性和函数的通用性,且又在程序的全部执行过程中都占用存 储空间。 在文件开头定义的外部变量才可在整个文件范围内使用,若在 定义点之前的函数需引用外部变量,则可用关键字“extern” 作“外部变量说明”。 注意:外部变量定义和外部变量说明并不是同一回事。外部变量 的定义只能有一次,它的位置在所有函数之外。而同一程序中 的外部变量说明可以有多次,它的位置在函数之内(哪个函数 要用就在哪个函数中说明)。系统根据外部变量的定义(而不是 根据外部变量的说明)分配存储单元。对外部变量的初始化只 能在“定义”时进行,“extern”只是申明该变量是一个已在 外部定义过的变量而已。 如果在同一源文件中,外部变量与局部变量同名,则在局部变 量的作用范围内,外部变量不起作用。 2012-6-12 19
2012-6-12 4
注意: 形参变量在被调用前不占用存储单元;在被调用结束 后,形参所占存储单元亦被释放。
实参可以是常量、变量或表达式。
必须指定形参类型,且必须与实参的类型一致。 实参对形参的数据传递是“值传递”。即单向传递, 不能逆传。 可以在形参表中直接说明形参类型。如:
输出结果: 0
2012-6-12
注意:这里是按自右至左 求值的,相当于fun(3,3)。 若按自左至右求值,则相 当于fun(2,3), 则输出为-1。
9
2.函数调用的方式
调用函数,可以有如下三种方式: 将函数调用作为一个语句。如: printf(“MS C pragramming”); gets(s); 将被调用的函数写在表达式中。如: c=2max(a, b); 注意:被调用函数max必须有确定的返回值。 将函数调用作为一个函数的实参。如: m=max(max(a, b), c);
2012-6-12 1
6.2 函数定义的一般形式
1.无参函数的定义形式
无分号!
类型标识符 函数名( ) { 说明部分 ; 语句; } 无参函数一般不需要返回函数值,可以省略类型标识符。 2.有参函数的定义形式 类型标识符 函数名(形式参数表) 形式参数说明; { 说明部分 ; 语句; }2012-6-12
“空函数”什么操作也不做。其作用是在此处留一函 数的位置,以便将来扩充功能之用。函数名也在将来 换取实际的函数名。
2012-6-12 3
6.3 函数参数和函数的值
1.形式参数和实际参数 例6.1 从键盘输入两个数,输出其中较大的一个。 main( ) { int a, b, c ; scanf(“%d,%d”, &a, &b); c=max(a,b); / a, b为实际参数 / printf(“Max is %d”,c); } max(x,y) / x, y为形式参数 / int x, y; { int z; z=x>y ? x : y; return(z); }
结果为:7
汉诺塔问题参考程序(将A座上的N个disks 借助B座移动到C座)
#include "stdio.h" void h(int m,char x,char y,char z); void main() {int n; char a='a';char b='b';char c='c'; printf("input disks:"); scanf("%d",&n); h(n,a,b,c); } void h(int m,char x,char y,char z) {if(m==2){printf("%d%c-->%c\n",m-1,x,y); printf("%d%c-->%c\n",m,x,z); printf("%d%c-->%c\n",m-1,y,z); } else { h(m-1,x,z,y); printf("%d%c-->%c\n",m,x,z); h(m-1,y,x,z); } 2012-6-12 }
无分号!
2
例: int max(x,y) int x, y; / 形式参数说明 / { int z; / 函数体中的说明部分 / z=x>y ? x : y; return(z); 这两行可以写成一行: } int max(int x, int y) 3.“ 空函数 ” 类型说明符 函数名( ) { }
为了明确表示不需要函数返回值,可以用“void”定 义函数为“无类型”。此时,不得使用a=printstar( )之 类的语句。 凡不需要返回值的函数,一般均定义为“void”类型。
2012-6-12 7
6.4 函数的调用
1.函数调用的一般形式 函数名(实参表); 说明: 对于无参函数,尽管没有“实参表”,但也不得省 略括号。 “实参表”中的参数之间用逗号分开。 实参与形参之间的个数及类型必须一一对应。 对实参求值的顺序是自左至右还是自右至左, 视具体 的系统而定。Turbo C 和 MS C 是按自右至左的顺 序求值。
3.对被调用函数的说明
在一个函数中调用另一个函数时: 如果被调函数为库函数,则应在文件开头用“#include”命令 声明相应的“头文件”。如: #include “stdio.h” #include “math.h”
2012-6-12 10
如果被调函数为自定义函数且其定义在主调函数定义之后,则 应在主调函数中声明其类型(称之为”函数声明”)。其语句形式 为: 类型标识符 被调函数名( );
第6章
6.1 函数概念
函数与宏定义
在进行程序设计时,程序员总是将复杂的问题进行 分解, 化整为零。编写一段小程序就能解决一个小问题, 然后将这些小程序拼装起来就能解决非常大而复杂的问 题。在 C 中,这些小程序统称为函数。 在 C 中,由系统提供的函数放在函数库中供用户选 用,以减少重复编写程序模块的工作量。 所有函数都是平行的,相互独立不能嵌套,但可以相 互调用(main函数不能被其它函数调用)。 C 函数分标准函数(库函数)和自定义函数。 C 函数本身分有参函数和无参函数。
Age(5–1)+2 Age(5) 入栈
2012-6-12
Age(4–1)+2
Age(5–1)+2 Age(5) 出栈
14+2=16
16+2=18
18
出栈结果
15
写出下面程序的运行结果: 例6.4 e #include "stdio.h" fun(int x) {int p; if(x==0||x==1) return 3; p=x-fun(x-2); return p; } void main() { printf("%d\n",fun(9)); }
17
6.7 局部变量和全局变量
1.局部变量 在一个函数内部定义的变量,只能在本函数内使用和 有效,称为“局部变量”。 主函数main中定义的变量,也只能在主函数内使用 和有效。 不同函数中可以使用相同名字的变量,且互不干扰。 形式参数也是局部变量,也只能在所在函数内使用和 有效。 可以在一个函数内的复合语句中定义变量,且这些变 量只在本复合语句中有效。 这种复合语句也称为“分程序”或“子模块”。 2.全局变量 在函数(包括main函数)外定义的变量为外部变量, 称为“全局变量”。全局变量的有效范围为从定义变 2012-6-12 18 量的位置开始到本源文件结束。
相关主题