![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=1739205811-koLeHV998coUKltvwboNge0E3ZLB1FEo-0-f63bf6e8f0dcd92ab25b82f30af4af0f)
上述函数定义的一般形式中,函数后面圆括号内部的参数(1个或多个)叫作形式参数,简称形参。这里,将通过各种演示把函数的一般形式展现出来。看看如下范例:
(1)函数无返回类型无形参
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85698.jpg?sign=1739205811-B7Doqoh3xx78pfdV13YOh0DMHEqNQziM-0-056f207eaf203cb824c002aca00eeb6d)
这里必须记住,如果一个函数不需要返回任何信息,则“返回类型”这里必须写为void,这是固定写法。
(2)有返回值有形参
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85699.jpg?sign=1739205811-sFItr7nCxezSBKCKrpNFpgydyrfvxUia-0-59df5b419c51002b88fd9eb28bed36da)
上面这个函数的参数存在的意义是表示有数据要传递到本函数中来,用这些参数来接收,这些参数(如a和b)叫形参,那如何调用这个函数呢?看如下调用方法:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p118_85700.jpg?sign=1739205811-cjaeK0a5wPUxjUxV6JWG2WPiXB4n2PDU-0-cc39715b717f5ee33aa1871a5d600687)
有几点说明:
①函数定义的第一行末尾没有分号,千万不要写成int addtwoshu(inta,int b);。
②调用该函数时,会为函数的形参分配内存,函数调用结束后,形参的内存会被释放,所以形参只能在函数内部使用。
③函数调用时传递给函数的参数称为实际参数,简称实参。实参可以是常量、变量、表达式。看如下代码:
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85707.jpg?sign=1739205811-2YmDNOlX3wf64aJGszxF14drZqokOvyC-0-82b101b1feafe5fbd275b725fff9dd54)
函数调用时实参的值就自动赋给了形参,如果实参和形参为数组名(数组名代表的是数组首地址),则传递的是数组首地址。对于这个话题,后面还会详细介绍。
④形参数量、类型要和实参数量、类型保持一致。
⑤C语言规定,实参变量对形参变量的数据传递是“值传递”,也就是单向传递,只由实参传递给形参,不能由形参传递给实参。当然,有些例外的情形,但暂时还不在讨论之中,目前只需要记住,参数传递的方式是单向值传递即可。
⑥下面对函数的调用之后,实参的值会传递给形参,这并不会改变实参i、j的值。因为刚刚说过,函数参数的传递是“单向值传递”。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85708.jpg?sign=1739205811-pbT73MMcLetuIgovziHNsJ6L8fEt9RH6-0-700da9580d2bb983cd3e384a59b2d397)
⑦函数如果有返回值,则函数里面一定会用return语句返回该值,函数外面调用者所在行可以用赋值语句接收函数的返回值。如果一个函数不需要返回任何值,则在该函数中可以不写return语句。看看如下范例。
范例1:返回表达式的值。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85709.jpg?sign=1739205811-e2aVMFVNXrutcTciKWFj40N4fBApW3B8-0-eb97943edc690e4d961b23e6411efc0c)
范例2:根据不同条件有多个return语句。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85710.jpg?sign=1739205811-CvNhYEgEjjPLVKKGEAdFTJo8OJJn1whv-0-6ca99175cd67fdc1ab5a8a96d93a5bf4)
范例3:如果实际返回的类型和函数定义的返回类型不一致,则系统会自动将返回的类型转成“函数返回值类型”,但不建议写这样的代码。
![](https://epubservercos.yuewen.com/F329F6/23721607801994206/epubprivate/OEBPS/Images/Figure-p119_85711.jpg?sign=1739205811-o6kpGx1pDA3njObRU3o7mhFaVGXyhuue-0-4f701b40816c4f0b2a95b2ec8d899f97)