函数是C语言程序的组成部分,C语言程序的功能可以通过函数之间的调用来实现。
C语言函数分为两类:
(1)标准函数:系统提供的已设计好的函数。
(2)用户定义的函数:用户自己编写的用来解决具体问题的函数。
说明:
1)一个源程序文件由一个或多个函数组成。一个源程序文件是一个编译单位,即以源文件为单位进行编译。
(2)一个C程序由一个或多个源程序文件组成。
(3)C和程序的执行从main函数开始,调用其它函数流程回到main函数,在main函数中,结束整个程序的运行。Main函数是系统定义的。
(4)所有函数都是平行的,即在定义函数时,是互相独立的,一个函数并不从属于另一个函数,即函数不能嵌套定义,但可以互相调用,但不能调用main函数。
(5)从函数的形式看,函数分两种:
(a)无参函数:主调函数并不将数据传送给被调用函数。
(b)有参函数:在调用函数时,在主调函数和被调函数之间有参数传递,也就是说,主调函数可以将数据传送给被调用函数使用,被调用函数中的数据也可以带回来供主调函数使用。
函数的定义:
格式
1 无参函数的定义:
函数返回值类型 函数名()
{
函数体;
}
说明:返回值类型可以是基本类型也可以是用户自定义类型.
2 有参函数的定义:
函数返回值类型 函数名(参数列表)
{
函数体;
}
说明:
(1)函数类型标识符:指出return语句返回的值的类型,它可以是C中代任意合法的数据类型。
(2)函数名:应是一个标识符。函数名后的一对圆括号是函数的象征。
(3)形式参数表列:是写在圆括号中的一组变量名,称为形式参数,形式参数之间用逗号分隔。无参函数,圆括号内为空。
(4)形式参数说明:是对形式参表列中的每一个形式参数所作的类型说明,应写在用花括号{ }括起来的孙函数体的前面。
(5)函数体:用{ }括起来的部分,函数体是由说明部分和语句部分组成的。
在调用函数时,大多数情况下,主调函数和被调函数之间有数据传递关系。
在定义函数时,函数名后面括号中变量名称为“形式参数”,简义“形参”。
在调用函数时,函数名后面括号中的表达式称为“实际参数”,简称“实参”
例如:
#include "stdio.h"
int max(int a,int b)
{
if(a>b)return a;
else return b;
}
void main()
{
int x,y,Max=0;
scanf("%d,%d",&x,&y);
Max=max(x,y);
printf("%d",Max);
}
关于形参与实参的说明:
(1)在定义函数中指定的形参变量,在末出现函数调用时,它们并不占内存中的存储单元。只有发生函数调用时函数max中的形参才被分配内存单元。调用结束后,形参所占用的内存单元也同时被释放。
(2)实参可以是常量、变量或表达式,如:max(3,a+b);但要求它们有确定的值。在调用时将实参的值赋给形参变量(如果形参是数组名,则传递的是数组首地址,而不是变量的值)。
(3)在定义的函数中,必须指定形参的类型。
(5)实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。
在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍然保留并维持原值,形参的值如果发生改变,并不会改变主调函数的实参值。
(6)ANSI新标准允许使用另一种方法对形参类型说明,即在列出“形参表列”中同时说明形参类型。
如:int max(int x,int y)
函数的返回值
在函数体中使用return语句:
格式:return (表达式);
说明:在函数中可以有多个return 语句,但只有一个能返回成功.
函数的调用:
格式:函数名(实参表列);
函数调用语句的执行过程:首先计算每个实参表达式的值,并把此值存入所对应的形参单元中,然后把执行流程转入函数体中,执行函数体中的语句,函数体执行完之后,将返回到调用此函数的程序的下一条语句,继续去执行。
当执行到函数体的右花括号或return语句时,表示函数体执行完成,这时将返回到主调程序中。
说明:
(1)如果是无参函数,则没有实参表列,但括弧不能省略。
(2)如果实参表列包含多个实参,则各参间用逗号隔开。实参与形参的个数应相等,类型应一致。实参与形参应一一对应,转递数据。
(3)对实参表求值的并不是确定的,系统是按自右向左的顺序求值。
例7.3求两数之和
#include "stdio.h"
void main( )
{float a,b,c;
float add( );
scanf(“%f,%f”,&a,&b);
c=add(a,b);
printf(“sum=%f”,c);
}
fioat add(x,y)
float x,y;
{float z;
z=x+y;
raturn(z);
}