![C++新经典](https://wfqqreader-1252317822.image.myqcloud.com/cover/184/44510184/b_44510184.jpg)
7.1.2 函数的定义和返回值
首先解释一下“函数参数”的概念。就是调用函数时,希望把一些数据传递给该函数,这个时候,该函数就需要用一些变量来接收这些传递过来的数据,这些接收数据的变量,就叫函数参数。
函数定义的一般形式如下,其中大括号{}包着的部分又称为函数体:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85697.jpg?sign=1739254042-yoEDabB6gHyUBJ8v4mOY88II7pH6ozbq-0-bd9bb9a5aa5b72c1c62df76040adbb53)
上述函数定义的一般形式中,函数后面圆括号内部的参数(1个或多个)叫作形式参数,简称形参。这里,将通过各种演示把函数的一般形式展现出来。看看如下范例:
(1)函数无返回类型无形参
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85698.jpg?sign=1739254042-aeaFg0kh6bsHOUCLz9A0cNHqOJU61E8X-0-a408648b894dcd88f6ea13d248f9d630)
这里必须记住,如果一个函数不需要返回任何信息,则“返回类型”这里必须写为void,这是固定写法。
(2)有返回值有形参
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85699.jpg?sign=1739254042-Hm3W1OUQHzppUCGqKdJZd6cBvUAV7Pjg-0-88470ce43693a4ca3047ce0eed4a8407)
上面这个函数的参数存在的意义是表示有数据要传递到本函数中来,用这些参数来接收,这些参数(如a和b)叫形参,那如何调用这个函数呢?看如下调用方法:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85700.jpg?sign=1739254042-rUAvA2iWFmHl6w3q22cuiU9EC4VnXhcD-0-6ca05027af789fc48500e4d26c390a05)
有几点说明:
①函数定义的第一行末尾没有分号,千万不要写成int addtwoshu(inta,int b);。
②调用该函数时,会为函数的形参分配内存,函数调用结束后,形参的内存会被释放,所以形参只能在函数内部使用。
③函数调用时传递给函数的参数称为实际参数,简称实参。实参可以是常量、变量、表达式。看如下代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85707.jpg?sign=1739254042-5QA7QeDSpcXOSmjRxX7j07aoccHdJE3l-0-b93b2d73a55ff95f74a15b8a0ad1778d)
函数调用时实参的值就自动赋给了形参,如果实参和形参为数组名(数组名代表的是数组首地址),则传递的是数组首地址。对于这个话题,后面还会详细介绍。
④形参数量、类型要和实参数量、类型保持一致。
⑤C语言规定,实参变量对形参变量的数据传递是“值传递”,也就是单向传递,只由实参传递给形参,不能由形参传递给实参。当然,有些例外的情形,但暂时还不在讨论之中,目前只需要记住,参数传递的方式是单向值传递即可。
⑥下面对函数的调用之后,实参的值会传递给形参,这并不会改变实参i、j的值。因为刚刚说过,函数参数的传递是“单向值传递”。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85708.jpg?sign=1739254042-TVWPg0V1JpQxO5yUpnaw5tYYzRzLrLHY-0-7c1df2fa9152b8c84bd613933d1c4533)
⑦函数如果有返回值,则函数里面一定会用return语句返回该值,函数外面调用者所在行可以用赋值语句接收函数的返回值。如果一个函数不需要返回任何值,则在该函数中可以不写return语句。看看如下范例。
范例1:返回表达式的值。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85709.jpg?sign=1739254042-BXu7wlLcsMogK8z67m8GsBcQkQPdi9fd-0-ed5400a7885285384be8a21f7dd420b5)
范例2:根据不同条件有多个return语句。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85710.jpg?sign=1739254042-1jXm0zIHjJHq1jFvWRMlD0HBPKM5yeQB-0-3dab8504287e555da2a95152b292fcb2)
范例3:如果实际返回的类型和函数定义的返回类型不一致,则系统会自动将返回的类型转成“函数返回值类型”,但不建议写这样的代码。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85711.jpg?sign=1739254042-ZrvmSjenWJP18djGBe635U2avAJEWW5t-0-349fe7df2367a8d5b022b8cc5d861cbb)