5.2 函数的调用
函数调用的一般形式为:
函数名(实参1,实参2,…)
函数名表示主函数中要调用的函数,括号里是实际参数(即实参),实际参数和被调用函数定义时的形式参数的类型和数量一致。
例5-2 在主函数中通过调用求两整数之和的函数add实现3和4的求和,并输出和。
分析:
在主函数中,也就是在main函数中,通过add(3,4)调用例5-1中定义的add函数,此时不需要加函数类型,只用函数名和参数就可以实现函数调用。
程序如下:


在主函数调用自定义的函数add时,必须在程序的开始添加一句预处理命令“#include stdio.h”,让编译系统在编译源程序时先包含stdio.h文件。stdio.h是“standard input and output.head”标准输入输出头文件的缩写。预处理命令结尾没有分号。
因为函数要先定义后使用,而输出函数printf并没有在程序中定义,如果直接在主函数中调用它,会提示如图5.1所示的错误。

图5-1 出现错误1
这个错误的出现就是因为printf函数没有定义,编译系统不认识它,无法执行。因此在使用printf函数前,要将定义该函数的文件包含进来,以便编译系统找到它的定义。
程序的执行除了预处理命令外,其他命令都是从主函数开始,一行一行地执行,因此,在任何一个函数调用前,都要先定义它,如果没有定义就直接去调用,就会出现错误。
例如,将上面的程序改为:

(https://www.daowen.com)
则会出现如图5-2所示的错误。

图5-2 出现错误2
图5-2中第一个错误是因为函数没有定义。因为add函数是在主函数之后定义的,程序的执行从main函数开始,一行一行地执行,当执行到add(3,4),直接调用函数时,并没有发现它的定义,因此提示该函数没定义。图5-2中第二个错误是由于C语言不支持函数重载(同名),所以在定义和声明时,参数个数、类型、返回值类型不一样就会出现这个错误。因此,在调用函数前,一定要先定义。如果确实在调用函数前,没有定义,那么一定要在调用前声明一下在后面定义函数。
上面程序可以改为:

在主函数中添加了一句语句“int add(int a,int b);”,将其作为对后面定义的add函数的一个声明,当程序执行到此处时,有了函数声明,编译系统会自动到后面的程序中去寻找声明函数的定义,这样程序执行时就不会再出现错误了。
在程序中,为了帮助其他人阅读和理解程序,往往会在程序后面添加注释。添加注释的方法有两种:一种是用“\*”和“*\”将注释语句写在中间;另一种是在“\\”后面写上注释语句。
注意:注释语句是不会被编译系统执行的,它只起到注释作用,不会影响程序的执行和功能。
例5-3 输入一个学生语文、数学、英语三门课程的成绩,使用函数求总成绩和平均成绩,并保留两位小数。
分析:
三门课程需要定义三个变量,而求总成绩和平均成绩,要定义两个函数sum和ave。然后在主函数中再去分别调用这两个函数。
定义求总成绩的函数sum,因为三门课成绩可能有小数位,因此定义变量为浮点型。函数的功能为求三个浮点型变量之和,和的类型也为浮点型。程序如下:

在主函数中对sum函数和ave函数进行调用时,括号里的参数为实际参数,它可以是常量,也可以是表达式或者变量。在例5-3中,以三个变量作为实参,通过sacnf函数从键盘输入三个浮点型数值,并将其分别赋值给变量a、b、c(以空格分隔)。
主函数也可以改为:

