函数的一般调用形式
函数的声明
在进行函数调用之前首先要对函数进行声明,在进行C程序函数开发与使用的过程中要牢记“先声明,后使用”的原则。
外部函数:在函数外进行的函数声明称为外部声明,如果声明在程序最前端,外部声明又称为全局声明。 | |
内部函数:在主函数内被调函数所作的声明称为内部声明,也称全局声明。 | |
外部函数跟内部函数的区别在于:一个文件中定义的函数能否被其它文件调用。能被调用的函数在前面加extern(一般省略),而不能被调用的加static(不能省略),通常函数本质上是全局的,也就是外部的可调用的 |
调用函数的声明具体形式:
函数类型 函数名();
C语言中的函数没有隶属关系,函数都是独立完成的,更不能嵌套定义,通过调用而执行的,函数之间可以互相调用,允许直接或间接的递归调用其自身。 | |
main函数是主函数,可以调用其他函数,但是不能被其他函数调用, 主函数不能被其他函数调用的原因:main 函数是程序的主体部分,只有它能调用其他函数。其他函数不能调用它。假设我们可以调用main函数,那么在main函数里面又调用这个函数,就会进入死循环,产生Runtime error的错误。 所以main函数并不能被调用,在逻辑上只能这样,而且符合C程序编写的要求,要耦合性,能少互相调用就少互相调用。
|
函数的调用
函数调用的一般形式为:
函数名(实际参数列表)
实际参数列表是函数入口参数的实际值。
注意:实参是个数,类型和顺序,应该与调用函数所要求的参数个数,类型和顺序一致,才能正确地进行数据传递。
在编写程序,进行函数调用时,注意以下几点:
(1)调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。 | |
(2)函数调用也是一种表达式,其值就是函数的返回值。 | |
(3)如果实参表中包括多个参数,对参数的求值顺序因系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反。 | |
(4)实参的类型与形参必须一一对应和匹配。 | |
(5)由于采用传值方式,实参列表中的参数允许为表达式及常量。尤其值得注意的是,对实参表达式求值,C语言并没有规定求值的顺序。 |
编写两个函数分别求两个整数的最大公约数和最小公倍数。
#include<stdio.h>
int GCD(int m,int n)
{
int p;
while(m%n)
{
p=m%n;
m=n;
n=p;
}
return n;
}
int LCM(int m,int n)
{
int p;
p=GCD(m,n);
return(m*n/p);
}
main()
{
int m,n;
printf("input m,n:");
scanf("%d %d",&m,&n);
printf("Greatest Common Divisor is:%d,Least Common Multiple is %d\n",GCD(m,n),LCM(m,n));
}
程序说明:第2~12行函数GCD计算两个数的最大公约数并返回最大公约数的值,这里使用的是辗转相除法求最大公约数;
第13~18行函数LCM计算两个数的最小公倍数并返回最小公倍数的值;
第21~23行定义局部整型变量m和n并从键盘输入进行赋值;
第24行调用函数GCD和LCM求m和n的最大公约数和最小公倍数并输出打印到屏幕上。
函数的嵌套调用
嵌套调用指的是在函数的调用过程中又出现了另一种函数调用,称为函数的嵌套调用。
解释一:
函数的嵌套调用是在函数调用中再调用其它函数,函数的递归调用是在函数调用中再调用该函数自身。
解释二:
函数嵌套是语言特性,递归调用是逻辑思想。
函数嵌套允许在一个函数中调用另外一个函数,比如有三个函数:
func1()
{
func2();
}
func2()
{
func3();
}
func3()
{
printf("Hello");
}
这个就叫做嵌套调用,它是一个语言提供的程序设计的方法,也就是语言的特性。
递归最明显的特点就是,自己调用自己(就是函数嵌套调用)
funca()
{
if(statement1)
funca();
else
exit(0);
}
概括说,函数嵌套就是函数调用函数,是普遍的,递归就是函数调用自身,使函数嵌套的一个特例。
递归的作用:
递归做为一种算法在程序设计语言中广泛应用.是指函数/过程/子程序在运行过程序中直接或间接调用自身而产生的重入现象.
递归是一个函数在其定义中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。用递归思想写出的程序往往十分简洁易懂。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
注意:
(1) 递归就是在过程或函数里调用自身;
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)