04 函数程序设计
1.函数的定义与调用
1.1 函数的定义与声明方法
一个函数由声明与定义组成。声明即函数的名称、返回类型和参数(不一定有),定义指函数体(要执行的代码)。比如:
//这一行叫做函数头。void是返回类型,意思是没有,即不返回任何值;sum()是函数名;圆括号里这堆是参数表
void sum(int begin, int end)
//在函数头之外,大括号内的叫做函数体。
{
int i;
int sum=0;
for(i = begin; i < end; i++)
sum += i;
printf("%d到%d的和是%d\n", begin, end, sum);
}
1.2 函数的调用方法
调用函数时给出函数名(参数值)。圆括号标志函数,即使没有参数也要保留()。比如:
#include <stdio.h>
void cheer()
{
printf("cheer\n");
}
int main()
{
cheer();
return 0;
}
若有参数要注意顺序与数量。比如:
#include <stdio.h>
void sum(int begin, int end)
{
int i;
int sum=0;
for(i = begin; i < end; i++)
{
sum += i;
printf("%d到%d的和是%d\n", begin, end, sum);
}
int mian
{
sum(1,10);
sum(2,20);
return 0;
}
1.3 函数的返回
return停止函数执行,并返回一个值。一个函数里可以有多个return。
return;
return 表达式;
这个值可以赋值给变量,可以再传递给函数,或者丢掉不管。比如:
#include <stdio.h>
int max(int a,int b);
{
//int ret;
if(a>b)
return a;
else
return b;
//return ret;
}
int main()
{
int a,b,c;
a = 5;
b = 6;
c = max(10,12);
c = max(a,b);
c = max(c,23);//这里的c就是上面返回的值12
max(1,2);//这个返回值没有传递给其他变量,丢弃
printf("%d\n", max(a,b));
return 0;
}
1.4 函数原型
对于没有返回值的函数,类型为void,不能使用带值的return,可以没有return,调用的时候不能做返回值的赋值。
C的编译器自上而下顺序分析代码,所以函数有先后关系。先有函数定义,再有函数调用。
如果上下颠倒了,在调用前写上函数头:
#include <stdio.h>
//声明
void sum(int begin, int end);//复制函数头到调用前,记得加上分号
//调用
int mian
{
sum(1,10);
sum(2,20);
return 0;
}
//定义
void sum(int begin, int end)
{
int i;
int sum=0;
for(i = begin; i < end; i++)
sum += i;
printf("%d到%d的和是%d\n", begin, end, sum);
}
函数头以分号结尾构成函数原型。函数原型告诉编译器这个函数的名称,参数数量及类型,返回类型。编译器并不检查函数名称,而只检查类型,所以函数原型里可以不写函数名称,上面例子的声明里就可以拿掉begin和end。
1.5 函数的参数传递方式
可以传递给函数的值是表达式的结果,包括字面量,变量,函数的返回值,计算的结果。传递的永远是一个确定的数值。
int a,b,c;
a = 5;
b = 6;
c= max(10, 12);
c = max(a, b);
c = max(c, 23);
c = max(max(c.23), a);
c = max(12+12, b);
调用函数时给的值与参数的传递类型要保持一致。如果不一致,编译器会转换,但往往不是我们需要的。小心不要在这里犯错。
每个函数有自己的变量空间,参数也位于这个独立空间,和其他函数无关。这一次与下一次的调用传值也是无关的。
过去,对于函数参数表中的参数,叫做形式参数;调用时给的值,叫做实际参数。
void swap(int a, int b)//这是形参
swap(a,b)//这是实参
现在,我们称呼形参为参数,实参为值。它们是参数和值的关系。
2.变量与函数
2.1 局部变量
定义在函数内部的变量称为局部变量(Local Variable),它的作用域仅限于函数内部, 离开该函数后就是无效的,再使用就会报错。例如:
int f1(int a){
int b,c; //a,b,c仅在函数f1()内有效
return a+b+c;
}
int main(){
int m,n; //m,n仅在函数main()内有效
return 0;
}
1) 在 main 函数中定义的变量也是局部变量,只能在 main 函数中使用;同时,main 函数中也不能使用其它函数中定义的变量。main 函数也是一个函数,与其它函数地位平等。
2) 形参变量、在函数体内定义的变量都是局部变量。实参给形参传值的过程也就是给局部变量赋值的过程。
3) 可以在不同的函数中使用相同的变量名,它们表示不同的数据,分配不同的内存,互不干扰,也不会发生混淆。
4) 在语句块中也可定义变量,它的作用域只限于当前语句块。
2.2 全局变量
在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。例如:
int a, b; //全局变量
void func1(){
//TODO:
}
float x,y; //全局变量
int func2(){
//TODO:
}
int main(){
//TODO:
return 0;
}
a、b、x、y 都是在函数外部定义的全局变量。C语言代码是从前往后依次执行的,由于 x、y 定义在函数 func1() 之后,所以在 func1() 内无效;而 a、b 定义在源程序的开头,所以在 func1()、func2() 和 main() 内都有效。
2.3 静态局部变量
静态局部变量只在定义它的函数中可见,并且只初始化一次。