函数是C语言的基本构成之一,是命名了的程序块。
函数定义
函数定义的通用格式为:
返回类型 函数名 (形式参数)
{
函数体
}
函数的返回类型是函数返回值的类型,不能是数组,指定为void
说明没有返回类型。函数的形式参数是在定义函数时声明调用函数时需要的变量,必须说明其类型,多个形式参数用,
分隔,其初始值在函数调用时由实际参数提供。函数体包含声明和语句,函数内声明的变量专使用局限在此函数内,可以为空。
/**************************************
* function_define.c *
* *
* C语言中的函数定义 *
**************************************/
#include <stdio.h>
float average(float a, float b)
{
return (a + b) / 2;
}
int main()
{
float a = 0.0f;
printf("输入a: ");
scanf("%f", &a);
float b = 0.0f;
printf("输入b: ");
scanf("%f", &b);
printf("a和b的平均数是%g\n", average(a,b));
return 0;
}
函数声明和函数原型
函数需要在其被调用之前定义或者在函数调用之前声明该函数。和变量声明类型,函数声明告诉编译器这个函数是实际存在的,其定义在某个文件中。函数声明的格式如下,是函数定义的第一行在末尾加;
返回类型 函数名(形式参数);
函数的声明必须和函数一致,可省略函数形参的名字,函数声明也称为函数原型。
/**************************************
* function_declare.c *
* *
* C语言中的函数声明 *
**************************************/
#include <stdio.h>
/*函数原型*/
float average(float a, float b);
int main()
{
float a = 0.0f;
printf("输入a: ");
scanf("%f", &a);
float b = 0.0f;
printf("输入b: ");
scanf("%f", &b);
printf("a和b的平均数是%g\n", average(a,b));
return 0;
}
float average(float a, float b)
{
return (a + b) / 2;
}
函数调用
函数调用由函数名和紧随其后的由圆括号包裹起来的实际参数组成,各实际参数用,
分隔。函数调用时后面的圆括号是必须的,对于没有声明形式参数的函数也需要。实际参数是通过值传递的,对形式参数的改变不会影响实际参数的值。
数组常用作函数的实际参数,但C语言没有提供确定传递给它的数组的长度的简单方法,而且在函数体内使用sizeof
计算出作为形式参数的数组变量的长度是不正确的。所以如果需要数组的长度,需要将长度作为额外的实际参数传入。数组作为函数参数的声明格式如下:
返回类型 函数名(数组类型 数组名[],...);
调用时直接传入数组名,不需要后面的[]
。但数组为多维数组时,只能忽略第一维的长度,其他维的长度必须在数组名后列出来:
返回类型 函数名(数组类型 数组名[][LEN][LEN2]...,...);
非void
函数使用return
语句返回值,并跳出函数的执行。在void
函数也可以使用return;
语句跳转程序的执行。
/**************************************
* function_array.c *
* *
* C语言数组作为函数实际参数 *
**************************************/
#include <stdio.h>
#define N 10
int sum_array(int a[])
{
int sum = 0;
int i = 0;
for (i = 0; i < N; i++)
{
sum += a[i];
}
return sum;
}
int main()
{
int a[N] = {0};
printf("输入10个整数:");
int i = 0;
for (i = 0; i < N; i++)
{
scanf("%d",&a[i]);
}
printf("十个整数的和为%d\n", sum_array(a));
return 0;
}
exit
函数
exit
函数是终止程序的一种方法,在main
函数中和return
语句的作用相同,在其他函数中,return
只是从当前函数返回,而exit
是退出程序的执行。exit
所在的头文件为stdlib.h
,传递的实际参数若是0表示正常退出,否则表示异常终止。EXIT_SUCCESS
和EXIT_FAILURE
是在stdlib.h
中定义的明确表示这两类而定义的两个宏,其值与实现有关,典型值为0和1.
/**************************************
* function_exit.c *
* *
* exit函数 *
**************************************/
#include <stdio.h>
#include <stdlib.h>
int sum(int a, int b)
{
if (a < 0)
exit(EXIT_FAILURE);
return a + b;
}
int main()
{
int a = 0;
int b = 0;
printf("输入a:");
scanf("%d", &a);
printf("输入b:");
scanf("%d", &b);
if (b < 0)
exit(EXIT_FAILURE);
printf("a和b的和为%d\n", sum(a, b));
exit(EXIT_SUCCESS);
}
递归函数
递归函数是调用自身的函数,递归函数必须声明终止条件,保证在有限的步骤后结束。
/**************************************
* function_recursive.c *
* *
* C语言中的递归函数 *
**************************************/
#include <stdio.h>
int frac(int n)
{
if (n <= 1)
return 1;
return n * frac(n - 1);
}
int main()
{
unsigned int n;
printf("输入一个正整数:");
scanf("%u", &n);
printf("%d! = %d\n", n, frac(n));
return 0;
}
参考文献
- K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社