2023.07.28
函数
模块化程序设计思路:事先编辑好一批常用的函数来实现各种不同的功能,需要用时,就直接在程序中使用即可,使得阅读和维护程序变得方便快捷。
C语言中的函数就是一个完成某项特定任务的一小段代码,从本质意义上来讲,函数就是用来完成一定的功能的。
在设计一个较大的程序的时候,往往把它分为若干个程序模块,每一个模块包括了一个或者多个函数,每个函数实现一个特定的功能。一个C程序可由一个主函数和若干个其他函数构成。由主函数调用其他函数,其他函数也可以互相调用。同一个函数可以被一个或者多个函数调用任意多次。
C语言中一般会见到两类函数:库函数和自定义函数。
前面有学习库函数的相关知识,这里不多讲述。
自定义函数:用户自定义的函数,它是解决用户专门需要的函数。
定义函数需要定义哪些方面呢?
①指定函数的名字。②指定函数的类型,即函数返回值的类型。③指定参数的名字和类型(若定义函数无参数,则不写或者写void)。④指定函数应当完成什么操作,即函数的功能。
定义无参函数
类型名 函数名( )
{
函数体
}
类型名 函数名(void)
{
函数体
}
函数名后面括号内的void表示“空”,即函数没有参数。
在定义函数时要用类型名指定函数值的类型,即指定函数带回来的值的类型,如果没有函数值,则应用void类型定义。
定义有参函数
类型名 函数名(形式参数表列)
{
函数体
}
//举例:输入a,b两数,求两数之间的最大值
int max(int x,int y)//定义max函数,有两个参数,并声明函数类型
{
int z; //声明部分,定义临时变量z
z=x>y?x:y; //执行语句部分,把x,y中最大的值赋给z
return(z); //把z值作为max函数的值带回main函数
}
#include <stdio.h>
int main( )
{
int max(int x,int y); //对max函数进行声明
int a;
int b;
int c;
//输入
scanf("%d %d",&a,&b);
c=max(a,b);
//调用求最值函数,将max(a,b)的值赋给c
printf("max=%d",c);
return 0;
}
定义空函数
类型名 函数名( )
{ }
void dummy( )
{ }
这个函数现在不起任何作用,但是在程序编写的初期,可以先用一个空函数占一个位置,日后再来扩写。
函数的调用
函数调用一般形式:函数名(实参表列)//不用写函数类型了
函数调用可以分为3种方式:
①函数调用语句
把函数调用单独作为一个语句。一般不要求函数返回什么值,只要求完成一定的操作即可。
void print_star( )
{
printf("**********\n");
}
void print_message( )
{
printf("I love you\n");
}
int main( )
{
void print_star( ); //声明print_star函数
void print_message( ); //声明print_message函数
print_star( ); //调用print_star函数
print_message( ); //调用print_message函数
print_star( );
return 0;
}
在这里调用这两个自定义的函数,均不要求返回函数值,只要求完成打印的操作即可,则函数可以不需要定义变量。
②函数表达式
函数调用时作为另一个表达式中,这时候要求函数返回一个确定的值以参加表达式的运算。
c=3*max(a,b); //函数调用返回一个确定值max,参加表达式的运算
③函数参数
函数调用作为另一个函数调用时的实参。
m=max(a,max(b,c));
其中,max(b,c)是一次函数调用,它的值是b,c中的最大值,把它作为max另一次调用的实参。赋值之后,m求的是a,b,c三者中的最大值;
形参和实参
在调用有参函数的时候,主函数和被调用函数之间有数据传递关系。
在定义函数时,函数名后面括号中的变量名称为“形式参数”,若不调用,不占用内存。
在主调函数中调用一个函数时,函数名后面括号中的参数称为“实际参数”,占用内存。
实参和形参关系
在调用函数的过程中,系统会把实参的值传递给被调用函数的形参,该值在函数调用期间有效,可以参加该函数中的运算。
实参可以是常量、变量或表达式,但是要求要有确定的值,以在调用函数时将实参的值赋给形参。
实参与形参的类型要相同。
函数的返回值
通过函数调用使主调函数能得到一个确定的值,这就是函数值(函数的返回值)。
函数的返回值是通过函数语句中的return语句获得的。如果不需要从被调函数中返回函数值,则可以不要return语句,应当用定义函数为“void类型”。
return后面的值可以是一个变量,可以是与一个表达式。
int max(int x,int y)
{
int z;
z=x>y?x:y;
return z;
}
int max(int x,int y)
{
return(x>y?x:y);
}
//两种书写形式等价
给定一个数组,将数组元素打印一遍出来,使用函数打印。
int main()
{
int array[]={0,1,2,3,4,5,6,7,8,9};
int sz=sizeof(array)/sizeof(array[0]);
int i;
void print(int array[],int sz);//数组写法 arr[常量表达式] 表示数组时,中括号不能省
print( array, sz);//调用函数时不用标明函数变量
return 0;
}
void print(int array[],int sz)
{
int i;
for(i=0;i<sz;i++)
{
printf("%d ",array[i]);
}
printf("\n");
}
输入两个实数,用一个函数求他们的和。
int main()
{
float a,b,c,x,y;
printf("输入两个实数");
scanf("%f %f",&a,&b);
float add(float x,float y);
c=add(a,b);//调用add函数时在函数内写实参
printf("和为%f",c);
return 0;
}
float add(float x,float y)
{
float z;
z=x+y;
return(z);
}
函数的嵌套使用
C语言中,不能嵌套定义函数,但是能嵌套调用函数,即在调用一个函数的过程中,又调用另一个函数。
明天的事明天再说,今天的我超越昨日的我。