一、形参与实参
形参:在定义函数时函数名后面括号中的变量名叫做形式参数,简称形参。形参是无内存单元(因而不存在)的任何合法标识符。
实参:在调用一个函数时,出现在调用语句函数名后面括号中的参数叫做实际参数,简称实参。实参是实际存在(因而有特定值)的常量、变量或表达式。
说明:
1. 在定义函数时指定的形参,在未被调用时它们并不占用内存中的存储单元,实际上也就是不存在的,因此称它们是形式参数或虚拟参数,表示它们并不是实际存在的数据,只有在函数调用发生时,被调函数中的形参才会被分配内存单元,以便接收从实参传来的数据。在调用结束后(即函数值返回后),形参所占用的内存单元也被释放(即形参又不存在了)。
2. 实参可以是常量、变量或者表达式,但作为实参表达式中的变量必须有确定值,以使得整个实参表达式有确定的值。
3. 在定义函数时,必须在函数首部指定形参的类型,至于形参使用何名字可随意。
4. 实参和形参的类型应该相同或者赋值兼容。两种参数类型完全一致无疑是完全合法、正确的。如果实参为整型而形参为浮点型,或者相反,则按不同类型数值的赋值规则进行转换,原则上不出现语法错误,但结果可能带来某些非期望的误差。例如实参的值是3.5,而被调函数的形参类型为整型,则调用函数会将3.5转化为整数3,然后送到形参,故此时形参值为3,由3计算出的函数值与用3.5计算出的函数值肯定有差别。
二、函数的定义
函数类型关键字 函数名([形式参数列表])
{
声明语句
执行语句
} (函数定义结束无分号)
1. 如果在函数首部函数名后面括号里省略形式参数(即为空括号)或者括号内填写void关键字,该函数就成为一个无参函数;
2. 如果在函数首部函数名后面括号里填写了形式参数,则它就是有参函数,有参函数通过参数列表列出每个参数的数据类型、参数 量名,若参数不止一个,则每个参数之间用逗号分割。
3. 如果主调函数书写在前,被调函数书写在后(或书写在别的文件中),或者被调函数是库函数,那么都需要先对被调函数提出声明,然后才能调用。声明的实际作用是提前通知编译系统有什么函数将被调用。只有下列特殊情况才不需要声明:被调函数是自定义函数,而且该函数出现在同一文件的主调函数之前,后面的主调函数已经知道它的存在,所以不需要声明。
4. 对库函数声明时只要在程序文件头部用include语句将这些包含文件包含到程序中来,就等于完成了对库函数的声明。
5. 对自定义函数的声明。必须在调用某自定义函数的语句出现之前,先做出如下声明:
函数类型关键字 函数名([参数1类型,参数1名称],[参数2类型,参数2名称],[],...); (函数声明结束有分号)
在声明语句中,参数名称可以省略,或者任意写一个名称,这种写法表示的形式叫做函数原型,即声明函数原型。函数原型有以下两种表示形式:
函数类型关键字 函数名([参数1类型],[参数2类型],[],...);
函数类型关键字 函数名([参数1类型,标识符1],[参数2类型,标识符2],[],...);
三、函数的返回值
所谓函数的返回值就是该函数的函数值。函数的返回值是通过函数定义中的return语句返回到主调函数的。
如果一个函数有返回值(即函数不是void函数),那么该函数的定义中必须有一个return语句;如果不需要函数返回值,则函数的定义中可以不要return语句。return语句的作用不仅可以将函数的值返回到主调函数,同时也是结束被调函数运行的语句。一个函数中可以有一个以上的return语句。返回值的类型由函数定义中的函数类型关键字唯一确定。
四、函数的调用
函数调用可能以下面三种形式出现:
1. 函数语句
把函数调用单独作为一个语句,并不要求函数返回值或者不需要函数的值,只是要把函数执行一遍以完成函数中的操作。如
output();
2. 函数表达式:对于有返回值的函数,函数调用可以出现在一个表达式中,这是函数值被当作一个参与表达式运算的数据。例如:
c=3*max(2,3);
3. 函数参数:函数调用得到的值作为另一次函数调用的实际函数。例如:
m=max(3,max(6,8));
五、函数的递归调用
在调用一个函数的过程中又出现直接或间接调用该函数本身的现象。例如:编写递归调用函数计算n!的值。
思路:求n!,应该先求(n-1)!;而求(n-1)!,又需要求(n-2)!而求(n-2)!,又需要求(n-3)!......如此类推,直到最后变成求1!的问题,而根据公式有1!=1(这就是本问题中的递归终止条件)。设求n!的函数为fac(),函数体内求n!,只要n>1,可以用n*fac(n-1)表示,即fac()函数体内将递归调用fac()自身;但一旦参数n为1,则终止调用函数并给出函数值1。
#include<iostream>
using namespace std;
long fac()
{
long f;
if (n==1)
{
f=1;
}
else
{
f=n*fac(n-1);
}
}
void main()
{ long y;
int n;
cout<<"please input a integer n"<<endl;
cin>>n;
y=fac(n);
cout<<"n="<<n<<","<<"y="<<y<<endl;
}