C语言函数可以分为标准库函数和自定义函数。标准库函数是C语言出厂自带的,可以直接调用的,但注意要写文件包含;自定义函数是自己编写自己调用的函数。例如
#include //标准输入输出库函数
void printN(int n); //声明函数printN
int main() //主函数
{
int n;
printN(n); //调用函数printN
return 0;
}
void printN(int n) //定义函数printN
{
printf("....\n");
}
注意:
(1)函数间可以互相调用,但不能调用main函数。main函数是系统调用的。
(2)C程序的执行是从main函数开始的,如果在main函数中调用其他函数,在调用后流程返回到main函数,在main函数中结束整个程序的运行。
(3)从函数的形式: 无参函数、有参函数
定义无参函数的一般形式为:
类型标识符 函数名()
{
声明部分
语句部分
}
定义有参函数的一般形式为:
类型标识符 函数名(形式参数表列)
{
声明部分
语句部分
}
定义空函数的一般形式为:
类型标识符 函数名()
{
}
函数调用的一般形式为:
函数名(实参表列)
如果是调用无参函数,则“实参表列”可以没有,但括弧不能省略
(1)函数语句
把函数调用作为一个语句。这时不要求函数带回值,只要求函数完成一定的操作
(2)函数表达式
函数出现在一个表达式中,这种表达式称为函数表达式。这时要求函数带回一个确定的值以参加表达式的运算。
(3)函数参数
函数调用作为一个函数的实参。
例如:
m = max (a , max ( b , c ) ) ;
printf ("%d", max (a, b));
定义有参函数时,函数名后面括弧中的变量名称为“形式参数”(简称“形参”);
调用有参函数时,函数名后面括弧中的参数称为“实际参数”(简称“实参”);return后面的值作为函数带回的值(称函数返回值);.
通过函数调用,使两个函数中的数据产生联系 。
#include
int max(int x, int y); //声明函数max
int main()
{
int a, b, c;
scanf_s("%d,%d", &a, &b);
c = max(a, b); //调用函数max,通过定义函数,将函数返回值赋给变量c
printf("max = %d\n", c);
return 0;
}
int max(int x, int y) //定义函数max
{
int z;
z = x > y ? x : y;
return(z); //函数返回int类型值
}
实参向形参的数据传递是“值传递”,单向传递。只能由实参传给形参,而不能由形参传回来给实参。
在内存中,实参单元与形参单元是不同的。 在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。这也就是为什么用函数交换两个数的值时要使用指针的原因。
(1)在定义函数时要指定函数返回值的类型。例如
int max(float x,float y) // 函数值为整型
char letter(char c1,char c2) // 函数值为字符型
double min(int x,int y) // 函数值为双精度型
void fun(double x,int y) // 无函数值
(2)如果函数值的类型和return语句中表达式的类型不一致,则以函数类型为准
/*函数类型是int型,但是返回值是float型,则函数调用时的类型为int型*/
#include
int max(int x, int y);
int main()
{
float a, b;
int c;
scanf_s("%f,%f", &a, &b);
c = max(a, b);
printf("max = %d\n", c);
return 0;
}
int max(int x, int y)
{
float z;
z = x > y ? x : y;
return(z);
}
在一个函数中调用另一个函数需要具备的条件:
(1)首先被调用的函数必须是已经存在的函数(是库函数或用户自己定义的函数)
(2)如果使用库函数,应该在本文件开头用#include命令将函数库“包含”进来
(3)如果使用自己定义的函数,而被调用的函数的位置在即主调函数的后面,应该在主调函数中对被调用的函数作声明
函数原型的一般形式为:
(1)
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……);
(2)
函数类型 函数名(参数类型1, 参数类型2,……);
声明的作用
把函数名、函数参数的个数和参数类型等信息通知编译系统,以便在遇到函数调用时,编译系统能正确识别函数并检查调用是否合法。
例如:函数名是否正确,实参与形参的类型和个数是否一致
注意:函数的“定义”和“声明”不是一回事
函数的定义
对函数功能的确立,包括指定函数名,函数值类型、形参及其类型、函数体等,它是一个完整的、独立的函数单位。
函数的声明
把函数的名字、函数类型以及形参的类型、个数和顺序通知编译系统,以便在调用该函数时系统进行对照检查
注:
(1)如果被调用函数的定义出现在主调函数之前,可以不必声明。因为编译系统已经知道了被调用函数的有关信息
#include
float add(float x, float y)
{
float z;
z = x + y;
return(z);
}
int main()
{
float a, b, c;
scanf_s("%f,%f", &a, &b);
c = add(a, b);
printf("max = %5.2f\n", c);
return 0;
}
(2)如果已在文件的开头,对本文件中所调用的函数进行了声明,则在各函数中不必对其所调用的函数再做声明
嵌套调用函数:在调用一个函数的过程中,又调用另一个函数
例,输入4个整数,找出其中的最大值。要求用函数的嵌套调用实现。
#include
int max2(int w, int x, int y, int z);
int main()
{
int a, b, c, d, max;
printf("Please enter 4 integers:\n");
scanf_s("%d,%d,%d,%d", &a, &b, &c, &d);
max = max2(a, b, c, d);
printf("\nThe largest is: %d\n", max);
return 0;
}
int max2(int w, int x, int y, int z)
{
int max1(int x, int y);
int max;
max = max1(w, x);
max = max1(max, y);
max = max1(max, z);
return max;
}
int max1(int x, int y)
{
int z;
z = x >= y ? x : y;
return z;
}