
2.4 了解如何定义函数
在任何一个C语言的程序里面,函数都是相当重要的组成部分。我们在创建每个函数时要考虑下面这5项要素:
□函数的标识符(function identifier):指的是函数的名称,它应该准确地描述函数的实际功能。
□函数的返回类型(function result type,返回类型也称为返回值类型(return value type)):函数可以给调用方返回一个值,而调用方不一定非得使用这个值,它也可以忽略该值。如果定义函数时指定了返回值的类型,那么函数返回给调用方的值必须是这种类型的值。
□函数块(function block):指的是紧跟在函数名称及参数列表后面的语句块,其中可以包含一些语句,用来执行该函数所要完成的任务。
□返回语句(return statement):函数在受到调用的过程中,要想把具有特定类型的某个值返回给调用方,主要手段就是通过返回语句来返回这样的值。
□函数的参数列表(function parameter list):这是一份可选的列表[1],用来定义计算过程中所需的一些参数,调用方在调用这个函数时需要把相应的值传给这些参数。
下面我们就来逐个讲解这几项要素。笔者讲解这些内容是想让你认识并理解它们,从而学会按照这样的一套模式(pattern)来创建自己所需的函数语句(或者说,定义自己所需的函数)。在讲解这些内容时,笔者依然采用Hello, world!程序里的main()函数作示例,因为这个例子相当简单,而且能够集中体现我们想要强调的每个要素。
函数的(返回值)类型、函数的标识符以及函数的参数列表合起来构成函数的签名[2](function signature)。在C语言的程序中,我们必须给每个函数赋予独特的标识符,而不能像在其他某些语言中那样定义名称相同但签名有所区别的多个函数。C语言不允许你这么做。程序在调用函数时,只会通过函数的标识符来确定函数的身份。
只要你用某个标识符来给某函数命名,那么就不能再用该标识符去定义另一个返回值类型或参数列表有所不同的函数。每个函数在C语言的代码中都必须具有独特的标识符。
注意,函数签名虽然能够用来显示某个函数的特征,但C语言并不通过签名来确定函数的身份,它只通过函数的标识符,也就是函数的名称本身来判断。因此,即便两个函数在参数列表或返回值类型上有所区别,只要它们的名称相同,就会导致程序出现编译错误。
[1] 这里所谓可选的列表(optional list),指的是定义函数的人可以定义这样一份列表,也可以不定义。——译者注
[2] 这里的签名是“特征”的意思。——译者注