函数的定义
C语言中,一个程序无论其大小,总是由一个或多个函数构成。每一个完整的C程序总是有且仅有一个main函数,它是程序的组织者,程序执行时也总是由main函数开始执行,由main函数直接或间接地调用其他函数来辅助完成整个程序的功能。
函数的分类
函数从用户使用角度可分为库函数和自定义函数。
库函数
目前为止,我们见过的printf(),scanf(),sqrt(),strcpy()函数都是ANSI C标准定义的库函数。
使用ANSI C的库函数,只要在程序的开头把该函数所在的头文件包含进来即可。比如,程序中要使用sqrt()函数,根据“ANSI C标准库函数表”得知该函数在math.h内定义,那么就在程序中加上:
#include<math.h>
自定义函数
用户自己定义函数,他们是用以解决用户专门需要的函数。
从函数的形式来看呢,函数也分两种:
(1)无参函数;在调用函数时,主调函数不向被调用函数传递数据。
(2)有参函数;在调用函数时,主调函数向被调用函数传递数据。一般情况下,执行被调用函数时会得到一个函数值,供主调函数使用。
函数的定义
有参函数定义
有参函数定义形式如下:
类型名 函数名(参数类型1 形参1,参数类型2 形参2,...)
{
函数体
}
例如:
int max(int x,int y)
{
int z;
z=x>y?x:y;
return(z); //return(z)与return z 等价
}
该程序定义了一个max函数,它有两个整型形参x和y,返回值也为整型。return(z)的作用是指定将z的值作为函数值(称函数返回值)带回到主调函数。此程序并非一个可运行的程序,有main函数的程序才能运行。函数必须被main函数直接或间接调用才能发挥作用。
无参函数定义
无参函数定义形式如下:
类型名 函数名()
{
函数体
}
或
类型名 函数名(void) //void表示“空”,即无函数。
{
函数体
}
空函数定义
空函数定义形式:
类型名 函数名()
{}
为什么会用到空函数?在编写程序的初始阶段,可以在将来准备扩充功能的地方写上一个空函数,只是这些函数还没有编写好,先用一个空函数占一个位置,等以后扩充功能时再用一个编好的函数代替它。
“函数名”是函数的唯一标识,它的命名规则与变量一样。习惯上的命名风格有两种:在Windows平台,普遍采用FunctionName这样的形式;在Linux/UNIX平台,习惯用function_name。
调用函数
定义函数的目的是调用函数,函数调用的一般形式如下:
函数名(实参1,实参2,...)
(1)如果“实参序列”包含多个实参,则各参数间用逗号隔开。如果是调用无参函数,则“实参序列”可以没有,但圆括号不能省略。即“函数名();”。
(2)定义函数时,圆括号内的参数称为形参。调用函数时,圆括号内的参数称为实参。实参与形参的个数应该相等,类型应一致。实参和形参按顺序对应,一一传递数据。
编写程序:
(1)先编写max函数
int max(int x,inty) //定义max函数
{
int z; //定义临时变量z
z=x>y?x:y; //把x和y中的大者赋给z
return(z); //把z作为max函数的值带回main函数
}
(2)再编写主函数
#include<stdio.h>
int main()
{
int max(int x,int y); //对max函数的声明
int a,b,c;
scanf("%d %d",&a,&b);
c=max(a,b); //调用max函数,有两个实参
printf("%d",c);
return 0;
程序分析:
先定义max函数(注意第一行的末尾没有分号)。第一行定义了一个函数,名为x,函数类型为int。指定两个形参x和y,形参的类型为int。
主函数中包含了一个函数调用max(a,b)。max后面的括号内的a和b是实参。x和y是在main函数中定义的变量。通过函数调用,在两个函数之间发生数据传递,实参a和b的值传递给形参x和y,在max函数里把x和y中最大值赋给变量z,z的值作为函数值返回给main函数,赋给变量c。
(1)实参a和b,形参x和y有各自的储存空间,函数参数传递是单向传递。函数调用时,实参值传递给形参,但形参值的改变不会影响实参。
(2)return语句用来指明返回值是什么。无论在函数什么位置,只要执行到它,立即返回到函数调用者位置。函数返回值只能有1个。
(3)函数的返回值类型可以是除数组外的任意类型,也可以是void类型,表示没有返回值。返回值为void类型的函数,也是遇到return就返回,但不要求有return语句。如果没有return语句,就一直运行到函数最后的最后一条语句,之后再返回。
函数的声明
函数声明有两种形式:
(1)返回值类型 函数名(参数类型1 参数名1,参数类型2 参数名2,…)
(2)返回值类型 函数名(参数类型1 ,参数类型2,…)
依然以上述max()函数为例,函数声明的格式为:
int max(int x,int y);
函数声明中形参名也可以默认,但参数类型必须写。例如:
int max(int,int);
(1)stdio.h和string.h等头文件的内容主要是各个库函数的声明。
(2)实际上,函数声明语句即可以在所有函数的外部,也可以在函数的内部。如果函数声明在所有函数外部,那么该函数声明语句之后出现的所有函数都可以调用被声明函数。