7.1.2 函数的定义和返回值
首先解释一下“函数参数”的概念。就是调用函数时,希望把一些数据传递给该函数,这个时候,该函数就需要用一些变量来接收这些传递过来的数据,这些接收数据的变量,就叫函数参数。
函数定义的一般形式如下,其中大括号{}包着的部分又称为函数体:
上述函数定义的一般形式中,函数后面圆括号内部的参数(1个或多个)叫作形式参数,简称形参。这里,将通过各种演示把函数的一般形式展现出来。看看如下范例:
(1)函数无返回类型无形参
这里必须记住,如果一个函数不需要返回任何信息,则“返回类型”这里必须写为void,这是固定写法。
(2)有返回值有形参
上面这个函数的参数存在的意义是表示有数据要传递到本函数中来,用这些参数来接收,这些参数(如a和b)叫形参,那如何调用这个函数呢?看如下调用方法:
有几点说明:
①函数定义的第一行末尾没有分号,千万不要写成int addtwoshu(inta,int b);。
②调用该函数时,会为函数的形参分配内存,函数调用结束后,形参的内存会被释放,所以形参只能在函数内部使用。
③函数调用时传递给函数的参数称为实际参数,简称实参。实参可以是常量、变量、表达式。看如下代码:
函数调用时实参的值就自动赋给了形参,如果实参和形参为数组名(数组名代表的是数组首地址),则传递的是数组首地址。对于这个话题,后面还会详细介绍。
④形参数量、类型要和实参数量、类型保持一致。
⑤C语言规定,实参变量对形参变量的数据传递是“值传递”,也就是单向传递,只由实参传递给形参,不能由形参传递给实参。当然,有些例外的情形,但暂时还不在讨论之中,目前只需要记住,参数传递的方式是单向值传递即可。
⑥下面对函数的调用之后,实参的值会传递给形参,这并不会改变实参i、j的值。因为刚刚说过,函数参数的传递是“单向值传递”。
⑦函数如果有返回值,则函数里面一定会用return语句返回该值,函数外面调用者所在行可以用赋值语句接收函数的返回值。如果一个函数不需要返回任何值,则在该函数中可以不写return语句。看看如下范例。
范例1:返回表达式的值。
范例2:根据不同条件有多个return语句。
范例3:如果实际返回的类型和函数定义的返回类型不一致,则系统会自动将返回的类型转成“函数返回值类型”,但不建议写这样的代码。