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 静态局部变量

静态局部变量只在定义它的函数中可见,并且只初始化一次。

posted @ 2022-11-05 02:17  许悠  阅读(119)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end
1 2 3
4