C语言函数说明与返回值
在进修C语言函数以前,我们需要相识什么是模块化措施设计要领。
人们在求解一个巨大问题时,凡是回收的是慢慢解析、分而治之的要领,也就是把一个大问题解析成若干个较量容易求解的小问题,然后别离求解。措施员在设计一个巨大的应用措施时,往往也是把整个措施分别为若干成果较为单一的措施模块,然后别离予以实现,最后再把所有的措施模块像搭积木一样装配起来,这种在措施设计中分而治之的计策,被称为模块化措施设计要领。
在C语言中,函数是措施的根基构成单元,因此可以很利便地用函数作为措施模块来实现C语言措施。
操作函数,不只可以实现措施的模块化,措施设计得简朴和直观,提高了措施的易读性和可维护性,并且还可以把措施中普通用到的一些计较或操纵编成通用的函数,以供随时挪用,这样可以大大地减轻措施员的代码事情量。
函数是C语言的根基构件,是所有措施勾当的舞台。函数的一般形式是:
type-specifier function_name(parameter list)
parameter declarations
{
body of the function
}
范例说明符界说了函数中return语句返回值的范例,该返回值可以是任何有效范例。假如没有范例说明符呈现,函数返回一个整型值。参数表是一个用逗号脱离的变量表,当函数被挪用时这些变量吸收挪用参数的值。一个函数可以没有参数,这时函数表是空的。但纵然没有参数,括号仍然是必需要有的。参数说明段界说了个中参数的范例。
当一个函数没有明晰说明范例时, C语言的编译措施自动将整型( i n t)作为这个函数的缺省范例,缺省范例合用于很大一部门函数。当有须要返回其它范例数据时,需要分两步处理惩罚:
首先,必需给函数以明晰的范例说明符;其次,函数范例的说明必需处于对它的首次挪用之前。只有这样,C编译措施才气为返回非整型的值的函数生成正确代码。
4.1.1 函数的范例说明
可将函数说明为返回任何一种正当的C语言数据范例。
范例说明符汇报编译措施它返回什么范例的数据。这个信息对付措施可否正确运行干系极大,因为差异的数据有差异的长度和内部暗示。
返回非整型数据的函数被利用之前,必需把它的范例向措施的其余部门说明。若不这样做,C语言的编译措施就认为函数是返回整型数据的函数,挪用点又在函数范例说明之前,编译措施就会对换用生成错误代码。为了防备上述问题的呈现,必需利用一个出格的说明语句,通知编译措施这个函数返回什么值。下例示出了这种要领。
第一个函数的范例说明sum()函数返回浮点范例的数据。这个说明使编译措施可以或许对sum( ) 的挪用发生正确代码。
函数范例说明语句的一般形式是:
type_specifier function_name (; )
纵然函数利用形参,也不要将其写入说明句。若未利用范例说明语句,函数返回的数据范例大概与挪用者所要求的纷歧致,其功效是难以预料的。假如两者同处于一个文件中,编译措施可以发明该错误并遏制编译。假如不在同一个文件中,编译措施无法发明这种错误。范例查抄仅在编译中举办,链接和运行时均不查抄。因此,必需十分细心以确保毫不产生上述错误。
当被说明为整型的函数返回字符时,这个字符值被转换为整数。因为C语言以不加说明的方法举办字符型与整型之间的数据转换,因而大都环境下,返回字符值的函数并不是说明为返回字符值,而是由函数的这种字符型向整型的缺省范例转换隐含实现的。
4.1.2 返回语句
返回语句r e t u r n有两个重要用途。第一,它使得内含它的谁人函数当即退出,也就是使措施返回到挪用语句处继承举办。第二,它可以用往返送一个数值。本章将说明这两个用途。
1. 从函数返回
函数可以用两种要领遏制运行并返回到挪用措施。第一种是在执行完函数的最后一个语句之后,从观念上讲,是碰着了函数的竣事符“ }”(虽然这个花括号实际上并不会呈此刻方针码中,但我们可以这样领略)。譬喻,下面的函数在屏幕上显示一个字符串。
一旦字串显示完毕,函数就没事可做了,这时它返回到被挪用处。
在实际环境中,没有几多函数是以这种缺省方法终止运行的。因为有时必需送回一个值,大大都函数用return语句终止运行,有时在函数中设立了多个终止点以简化函数、提高效率。切记,一个函数可以有多个返回语句。如下所示,函数在s 1、s 2相等时返回1,不相等时返回- 1。
#p#分页标题#e#
2. 返回值
所有的函数,除了空值范破例,都返回一个数值(切记,空值是ANSI发起尺度所做的扩展,也许并不适合读者手头的C编译措施)。该数值由返回语句确定。无返回语句时,返回值是0。这就意味着,只要函数没有被说明为空值,它就可以用在任何有效的C语言表达式中作
为操纵数。这样下面的表达式都是正当的C语言表达式。
x = power (y);
if (max (x,y) >100) printf("greater;")
for (ch=getchar( ); isdigit (ch);) . . . ;
但是,函数不能作为赋值工具,下列语句是错误的:
s w a p ( x ,y) =100;
C编译措施将认为这个语句是错误的,并且对含有这种错误语句的措施不予编译。
所有非空值的函数城市返回一个值。我们编写的措施中大部门函数属于三种范例。第一种范例是简朴计较型—函数设计成对变量举办运算,而且返回计较值。计较型函数实际上是一个“纯”函数,譬喻sqr( )和sin( )。第二类函数处理惩罚信息,而且返回一个值,仅以此暗示
处理惩罚的乐成或失败。譬喻write( ),用于向磁盘文件写信息。假如写操纵乐成了, write( )返回写入的字节数,当函数返回- 1时,符号写操纵失败。最后一类函数没有明晰的返回值。实际上这类函数是严格的进程型函数,不发生值。假如读者用的是切合A N S I发起尺度的C编译措施,那么所有这一类函数该当被说明为空值范例。奇怪的是,那些并不发生令人感乐趣的功效的函数却无论如何也要返回某些对象。譬喻printf( )返回被写字符的个数。然而,很难找出一个真正查抄这个返回值的措施。因此,固然除了空值函数以外的所有函数都返回一个值,我们却不必非得去利用这个返回值。有关函数返回值的一个常见问题是:既然这个值是被返回的,我是不是必需把它赋给某个变量?答复是:不必。假如没有用它赋值,那它就被扬弃了。请看下面的措施,它利用了mul( )函数。mul( )函数界说为:int mul(int x, int y){……}
在第一行, mul( )的返回值被赋予z,在第二行中,返回值实际上没有赋给任何变量,但被printf( )函数所利用。最后,在第三行,返回值被扬弃不消,因为既没有把它赋给第一个变量,也没有把它用作表达式中的一部门。