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