
2.4.3 了解函数的返回值
函数语句可以给调用方返回一个值,这项操作需要在函数的语句块里面执行。调用方可以使用这个值,也可以不使用,并没有强制的要求。例如在Hello, world!程序中,printf()函数实际上就返回了一个值,但我们并没有使用该值。
如果函数语句指定了返回值的类型,那么函数必须返回一个这种类型的值。这主要说的是两条规则:
□第一,写出函数的返回值类型,并把这个类型写在函数名称的前面(也就是左侧)。
□第二,函数在它的语句块里面要返回一个与该类型相符的值。
在2.4.2节的main.c程序里面,main()函数的返回值类型是int,这表示我们必须让main函数向调用方返回一个整数(integer或whole number)。在函数的语句块即将结束时,我们写了return 0;这样一条语句,意思是把0这个整数值返回给调用方。对于绝大多数操作系统(例如UNIX、Linux、macOS、Windows)来说,返回0通常意味着程序在执行过程中没有遇到错误。
除了int这种特定的返回类型之外,你还可以把函数的返回值类型指定成void,意思是这个函数不返回值(或者说,没有返回值)。对于这种函数来说,它的语句块里可以有return语句,也可以没有。我们来看下面这两个函数:

其中,printComma()函数的返回值类型是void。把void写在这里意味着该函数没有返回值,或者说该函数不返回任何值。在函数的主体部分(function body,函数体)中,我们明确写出了一条return语句,其实这条语句也可以不写,因为只要程序执行到函数体的右花括号那里,就会自动把控制权返回给调用方。另外要注意,由于printComma()函数的返回值类型是void,因此,如果我们在函数中明确写出return语句,那么这条语句不能带有返回值,而是应该直接以分号结束,也就是要写成return;。
下面这个hello2.c程序在返回值类型为void(也就是不带返回值)的函数里面明确使用了return语句:

这个hello2.c程序里面有一个函数,它的功能是向控制台输出一个逗号与一个空格。请把这段程序录入你的计算机,然后编译、运行并验证运行结果是否正确。这个程序验证起来应该很容易,因为它应该输出的文字实际上跟我们前面验证过的Hello, world!程序是一样的。当然,这个程序本身并没有太多的用途。
笔者设计这样一个程序意思是想调整原来的Hello, world!程序,让它改用两个函数同时实现最初只通过一个函数所实现的功能。这两个程序的输出结果是相同的。本章关注的主要是这套调用函数以及从函数中返回的机制,而不是函数的具体功能。我们在继续学习C语言的过程中,会写出更有意义而且彼此之间更有关联的函数。
与早期的C语言规范相比,后来的规范允许省略(main函数中的)return 0;。也就是说,如果没有return;或return 0;语句,那么系统就默认该函数会返回0这个值。按照惯例,这样一个值意味着函数是正常执行的,没有遇到错误。明白了这一点,我们就可以写出符合新规范且篇幅最短的main()函数了:

hello2.c程序里面的那个main()函数也可以相应地省略成如下形式:

在本书接下来的内容里面,我们会按照这样的惯例做出省略。
如果函数确实会通过返回值来表示它在执行过程中遇到的错误,那么你在调用这种函数之后,就应该把它返回的这个错误码捕获下来,并在发生相关错误时做出反应。笔者会在第4章与第6章讲解这个问题。