这篇主要讲解一下函数的一些基本概念及其用法。先放一张图,有助于更清楚的阅读。
应用环境
函数是一种能完成特定功能的程序代码的一个单元。它提供给我们一个和黑子的概念,让代码模块化,当你需要实现某一功能的时候,即可调用一个函数来帮你做,这样减少了重复工作,也让代码更加模块化,使得代码的阅读,完善和维护更加简单。
函数的用法
当你想调用一个函数的时候,一般如下格式
函数名(参数)
比如这样printf("打印函数");
函数定义的一般形式如下:
类型标识符 函数名()
{
声明部分
语句
}
这是一个无参数函数的定义。其中类型标识符和函数名称为函数头。类型标识符指明了本函数的类型,函数的类型实际上是函数返回值的类型。该类型标识符与前面介绍的各种说明符相同。函数名是由用户定义的标识符,函数名后有一个空括号,其中无参数,但括号不可少。{}中的内容称为函数体。在函数体中声明部分,是对函数体内部所用到的变量的类型说明。在很多情况下都不要求无参函数有返回值,此时函数类型符可以写为void,或者不写。
函数的参数分为实参和形参,实参可以是常数、变量、表达式等,多个实参用逗号,
分隔。形参是你声明和定义时所用的参数,实参则是你实际调用时的参数。
函数的嵌套使用
函数不能嵌套定义,但可以嵌套调用,也就是在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用,即在被调函数中又调用其它函数。这样也就实现复杂功能的简单化。例如这样
#include <stdio.h>
//求阶乘
long factorial(int n){
int i;
long result=1;
for(i=1; i<=n; i++){
result *= i;
}
return result;
}
/ / 求累加的和
long sum(long n){
int i;
long result = 0;
for(i=1; i<=n; i++){
//嵌套调用
result += factorial(i);
}
return result;
}
int main(){
printf("1!+2!+...+9!+10! = %ld\n", sum(10));
return 0;
}
递归函数
递归函数一般是学习函数过程中的一个难点,它也是函数嵌套使用的一种,不过有些不同于普通的函数嵌套,在调用过程中,执行的语句中有将自身再次调用的语句。在写递归函数的过程中必须有结束条件的语句。
比如下面这个例子
#include <stdio.h>
void up_and_down(int);
int main()
{
up_and_down(1);
return 0;
}
void up_and_down(int n)
{
printf("leave %d: n location %p\n",n,&n );
if(n<4)
up_and_down(n+1);
printf("leave %d:n location %p\n",n,&n );
}
函数的返回值
函数的返回值就是你所要实现功能的结果表现,它的类型与函数的类型相同,当你定义函数的时候,定义了什么类型的函数,函数的返回值就是什么类型,就像这样,看这几行代码
自定义函数
虽然c语言的函数库很丰富,但是总有的时候不能找到合适的函数,这个时候我们就可以自己动手来,编写一个函数。自定义一个函数主要有一下几个步骤
1.声明函数
2.定义函数
3.编写语句
例如下面这个例子
#include <stdio.h>
int xiao(int n,int m);
int main()
{
int evil1,evil2;
printf("Enter a pair of integers(q to quit):\n");
while(scanf("%d %d",&evil1,&evil2) == 2)
{
printf("The lesser fo %d and %d is %d.\n",evil1,evil2,xiao(evil1,evil2));
printf("Enter a pair of integers(q to quit):\n");
}
printf("Bey\n");
return 0;
}
int xiao(int n,int m)
{
return (n<m)?n:m;
}
函数声明给出了函数名、返回值类型、参数列表(参数类型)等与该函数有关的信息,称为函数原型(Function Prototype)。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,也不会出错。函数的声明一般在mina函数前面,语句后有分号。
函数的定义一般在最后或者其他文件里。