文档介绍:第 5 章模块化程序设计
概述
函数定义的一般形式
函数参数和函数的值
函数的调用
函数的嵌套调用
函数的递归调用
局部变量和全局变量
动态存储变量与静态存储变量
内部函数和外部函数
编译预处理
“文件包含”处理
条件编译
第 5 章模块化程序设计
在进行程序设计时,程序员总是将复杂的问题进行
分解, 化整为零。编写一段小程序就能解决一个小问题,
然后将这些小程序拼装起来就能解决非常大而复杂的问
题。在 C 中,这些小程序统称为函数。
在 C 中,由系统提供的函数放在函数库中供用户选
用,以减少重复编写程序模块的工作量。
所有函数都是平行的,相互独立不能嵌套,但可以相
互调用。
C 函数分标准函数(库函数)和自定义函数。
C 函数本身分有参函数和无参函数。
概述
函数定义的一般形式
类型标识符函数名( )
{ 说明部分;
语句;
}
无参函数一般不需要返回函数值,可以省略类型标识符。
类型标识符函数名(形式参数表)
形式参数说明;
{ 说明部分;
语句;
}
例: int max(x,y)
int x, y; /形式参数说明/
{ int z; /函数体中的说明部分/
z=x>y ? x : y;
return(z);
}
类型说明符函数名( )
{ }
“空函数”什么操作也不做。其作用是在此处留一函数的
位置,以便将来扩充功能之用。函数名也在将来换取实
际的函数名。
这两行可以写成一行:
int max(int x, int y)
3.“空函数”
函数参数和函数的值
从键盘输入两个数,输出其中较大的一个。
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);
}
注意:
形参变量在被调用前不占用存储单元;在被调用结束
后,形参所占存储单元亦被释放。
实参可以是常量、变量或表达式。
必须指定形参类型,且必须与实参的类型一致。
实参对形参的数据传递是“值传递”。即单向传递,不
能逆传。
可以在形参表中直接说明形参类型。
如:
int max(int x, int y);
float fun(int a[10], int n);
函数的返回值是通过return语句获得的。当不需返
回函数值时,可省去return语句。
return语句的后面可以有括号,也可以没有。
如:
return z ; return(z);
return语句的后面可以是变量,也可以是表达式。
如:
return(x >y ? x : y);
return语句返回值的类型应与该函数的类型一致。
否则以函数类型为准。
若函数中没有return语句,则该函数被调用后也会带
回不确定的值。
{ int a, b, c ;
a = printstar( );
b = print_message( );
c = printstar( );
printf(“%d,%d,%d\n”,a,b,c);
}
输出的a, b, c的值将是各个被处理的字符串的长度。
为了明确表示不需要函数返回值,可以用“void”定义
函数为“无类型”。此时,不得使用 a=printstar( ) 之
类的语句。
凡不需要返回值的函数,一般均定义为“void”类型。
如:
均为处理字符串的函数
且均没有 return 语句。
函数的调用
函数名(实参表)
说明:
对于无参函数,尽管没有“实参表”,但也不得省略
括号。
“实参表”中的参数之间用逗号分开。
实参与形参之间的个数及类型必须一一对应。
对实参求值的顺序是自左至右还是自右至左, 视具体
的系统而定。Turbo C 和 MS C 是按自右至左的顺
序求值。
main( )
{ int i =2 , p ;
p = f ( i , + + i );
printf ( “%d”, p ) ;
}
int f ( a , b ) ;
int a ,