第八章 函数与宏定义
8.1函数的概念
为什么要使用函数?
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
- 使用函数可使程序清晰、精炼、简单、灵活。
- 函数就是功能。一个函数实现一个功能。
函数名应反映其代表的功能。 - 在设计较大程序时,一般把它分为若干个程序模块,每一个模块实现一个特定的功能。
- 一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。
- 同一个函数可以被一个或多个函数调用任意多次。
~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
C语言的函数分为两类:
①系统定义的标准函数,又称为库函数。
函数声明一般是放在系统的include目录下以.h为后缀的头文件中,如在程序中要用到某个库函数,必须在调用该函数之前用#include<头文件>命令将库函数信息包含到本程序中。
②自定义函数。
按要求设计
C语言程序设计的核心之一:自定义函数。
8.1.1 函数的定义
- 自定义函数
[存储类型符] [返回值类型符] 函数名([形参说明表])
{
<函数语句体>
}
说明:
1.[存储类型符] 指的是函数的作用范围,只有两种形式:static和extern。
static说明的函数称为内部函数,只能作用于其所在的源文件,
extern说明的函数称为外部函数,可被其他源文件中的函数调用。
- 缺省情况为extern
2.[返回值类型符] 指的是函数体语句执行完成后,函数返回值的类型。
如int,float,char等。
- 若函数无返回值,则用空类型void来定义函数的返回值。
- 默认情况为int型(有些编辑器不支持默认情况)。
3**.函数名**由任何合法的标识符构成
- 建议将函数名的命名与函数内容有一定关系
4.[形参说明表] 是一系列用逗号分开的形参变量说明。
如:int x,int y,int z,
表示形参变量有三个:x,y,z。类型都是int型的。
注意: 不能直接写成:int x,y,z。
5.在古典式函数定义中,[形参表] 只要形参名,不要类型名。如:x,y,z。
表示形参变量有三个。形参变量的类型通过型参说明 语句说明。
- [行参说明表]或[形参表]都可以缺省,缺省时表示函数无参数。
6. 函数语句体是放在一对花括号{ }中,由局部数据类型描述和功能实现两部分组成。
- 函数返回语句。
通常用返回语句来结束函数的调用。 - 两种形式的返回语句:
①函数无返回值的情况
return
②函数有返回值的情况
return(表达式的值);
8.1.2 函数的声明和调用
通常情况下,自定义的函数在使用之前要先进行函数声明,才能在程序中进行函数调用。
1.函数声明
函数声明语句的形式:
[存储类型符] [返回值类型符] 函数名([形参说明表]);
如:int abs_sun(int m,int n);
(abs是求绝对值函数)
2.函数调用函数定义好后,若不通过函数调用,不会发挥任何作用。
函数调用是通过函数调用语句来实现的。
①函数无返回值情况:
函数名([实参表]);
②函数有返回值的情况:
变量名=函数名([实参表]);
注意: 变量名的类型必须与函数的返回值类型相同。
函数调用时,会去执行函数中的语句内容,函数在执行完毕后,回到函数的调用处,继续执行程序中函数调用后面的语句。
8.1.3 函数的传值方式
函数传值的4个要点:
①对于带有参数的函数,调用时,将实参表中每一个实参的值对应的传递给每一个形参变量;
②形参变量接收到实参传来的值后,会在内存临时开辟新的空间,保存形参变量的值;
③函数执行完毕时,释放临时开辟的内存空间;
④形参的值在函数中不论是否发生变化,实参变量的值均不会发生变化。
自定义函数在程序中的使用方式有两种形式:
①先声明函数声明,再进行函数调用,函数定义放在main函数的后面。
②先定义函数,再调用函数(不需要在调用前函数声明)。
【例8.1】编写程序,通过调用函数int abs_sum(int a,int b),求任意两个整数的和。
第一种形式:先进行函数声明;
再进行函数调用;
最后给出函数定义。
#include<stdio.h>
int abs_sum(int m,int n);/*函数声明*/
main()
{
int x,y,z;
scanf("%d%d",&x,&y);
z=abs_sum(x,y); /*函数调用*/
printf("|%d|+|%d|=%d\n",x,y,z);
}
int abs_sum(int m,int n)/*函数定义*/
{
if(m<0)
m=-m;
if(n<0)
n=-n;
return m+n;
}
第二种形式:先定义函数;
再调用函数
(不需要在调用前函数声明)
#include<stdio.h>
int abs_sum(int m,int n)/*函数定义*/
{
if(m<0)
m=-m;
if(n<0)
n=-n;
return m+n;
}
main()
{
int x,y,z;
scanf("%d%d",&x,&y);
z=abs_sum(x,y); /*函数调用*/
printf("|%d|+|%d|=%d\n",x,y,z);
}
思考:
1.怎样求任意3个整数之和?
(自己写的)
//注意if函数体后面有;
//双引号内是%
//返回值要赋值给一个定义好的变量
//定义函数名后面有实参表,前面有存储类型符
#include<stdio.h>
int abs_sum