学习笔记之C++函数

本文详细介绍了C++中的函数,包括形参与实参的概念及其区别,函数的定义、返回值,以及如何进行函数调用。特别强调了函数的递归调用,解释了如何利用递归计算阶乘值。

一、形参与实参

形参:在定义函数时函数名后面括号中的变量名叫做形式参数,简称形参。形参是无内存单元(因而不存在)的任何合法标识符。

实参:在调用一个函数时,出现在调用语句函数名后面括号中的参数叫做实际参数,简称实参。实参是实际存在(因而有特定值)的常量、变量或表达式。

说明:

 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值