我们在编程的时候会遇到比较复杂的程序,有时候可以把一些含有特定功能的一部分写成一个函数,这一部分就是学习函数的写法。尤其是很多时候我们会遇到代码复制的情况,这时候用函数就会使代码变得更好,同时也方便进行修改和使用。
1. 函数:
函数是一块代码,可以接受0个或多个参数,做一件事情,并返回0个或1个值。
例1.1求和函数:sum()函数部分
void sum(int begin,int end)
{
int i;
int sum=0;
for(i=begin;i<=end;i++)
{
sum+=i;
}
}
2. 函数头
void表示返回类型,sum为函数名,“()”内部的是参数表,表明这个函数有两个int类型的参数。
例1.2:求和函数:主函数部分
int main()
{
sum(20,30);
printf("%d\n",sum);
return 0;
}
3. 函数调用:
函数名(参数值);
其中“()”起到表示函数调用的作用,即使没有参数也要加“()”。
如果有参数,需要给出正确的数量与顺序,这些值会按照顺序依次用来初始化函数中的参数。
例2.1 最大值判断
int max(int a,int b)
{
int ret;
if(a>b)
ret=a;
else
ret=b;
return ret;
}
int main()
{
int a=6,b=4;
int i;
i=max(a,b);
printf("max(%d,%d)=%d\n",a,b,i);
return 0;
}
4. 函数返回及结果传递
return停止函数的执行,并送回一个值
return;
return 表达式(一个值也是一个表达式);
有返回值的时候进行函数调用时,如果需要得到返回值,可以用一个变量来存储函数返回值,如例2的 i=max(a,b); 这一语句。
如果没有返回值可以用void这个无返回值的函数类型,如果有返回值则需要用int类型的函数定义。
5. 函数声明
函数先后关系:
如上面的例2.1,把max()写在上面,是因为:
C语言编译器是自上而下顺序进行代码分析,如果看到max(a,b),它需要知道sum的函数类型、参数类型等的信息,所以函数调用应该在函数调用之后。
函数声明:
如果不知道先后,我们则需要在主函数前面进行函数声明,实际可以将函数头复制到最前面,加“;”既可,具体方法如下
例2.2 最大值判断 函数声明
#include<stdio.h>
int max(int a,int b);//声明
int main() //主函数
{
int a=6,b=4;
int i;
i=max(a,b);
printf("max(%d,%d)=%d\n",a,b,i);
return 0;
}
int max(int a,int b) //函数定义
{
int ret;
if(a>b)
ret=a;
else
ret=b;
return ret;
}
6. 参数传递
在前面的部分介绍过对于有返回值的函数,从主函数传递参数到调用的函数中进行计算,再返回参数,这些都是函数之间的参数传递。如果传递过程中有类型不匹配问题,C语言会进行强制类型转换,直接转化为对于类型的参数进行返回。
例3 交换两个值
#include<stdio.h>
void swap(int a,int b);
int main()
{
int a=5;
int b=6;
swap(a,b);
printf("a=%d,b=%d",a,b);
return 0;
}
void swap(int a,int b)
{
int t=a;
a=b;
b=t;
}
对例3进行编译运行,我们会发现并没有a、b值交换的作用。这里就涉及了函数之间传递“传过去的是什么”的问题,分析如下:
传值:每个函数有自己的变量空间,参数也位于这个独立的空间中,和其他函数没有关系。函数参数传递过程中有实际参数与形式参数的说法,但是我们现在可以简单的理解为参数与值的关系,把函数间的参数传递直接理解为就是进行值的传递,而不是对参数进行传递。
7. 本地变量
函数的每次运行,就产生了一个独立的变量空间,在这个空间中的变量势函数这次运行所独有的,称作本地变量。定义在函数内部的变量就是本地变量,参数也是本地变量。
变量的生存期与作用域:
生存期是指变量从什么时候出现,在什么时候消亡;作用域是变量在什么范围内可以起作用;对于本地变量,变量的生存期与作用域是统一的,都是大括号内部的部分。
对于例3来说,swap()函数中的a、b、t都是swap()块中的本地变量,对main中的a、b无关。
本地变量规则:
本地变量是定义在块内的;
程序运行到这个块之间这个本地变量是不存在的,运行完这个块这个变量就消失了;
块外面定义的变量在里面依然有效;
块里面定义的参数如果与外面的同名则覆盖了外面的参数;
本地变量不会被默认初始化。