2015年计算机二级C语言基础:C语言函数说明与返回值
发布时间:2012/5/21 11:25:31 来源:城市网学院 编辑:ziteng
在进修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说话以不加声名的体例进行字符型与整型之间的数据转换,因而大都情形下,返回字符值的函数并不是声名为返回字符值,而是由函数的这种字符型向整型的缺省类型转换隐含实现的。 [NextPage] 4.1.2 返回语句
返回语句r e t u r n有两个主要用途。第一,它使得内含它的阿谁函数当即退出,也就是使轨范返回到挪用语句处继续进行。第二,它可以用往返送一个数值。本章将声名这两个用途。
1. 从函数返回
函数可以用两种体例遏制运行并返回到挪用轨范。第一种是在执行完函数的最后一个语句之后,概略念上讲,是碰着了函数的竣事符“ }”(当然这个花括号现实上并不会呈此刻方针滤鱿脯但我们可以这样理解)。例如,下面的函数在屏幕上显示一个字符串。
一旦字串显示完毕,函数就没事可做了,这时它返回到被挪用处。
在现实情形中,没有若干好多函数是以这种缺省体例终止运行的。因为有时必需送回一个值,大大都函数用return语句终止运行,有时在函数中设立了多个终止点以简化函数、提高效率。切记,一个函数可以有多个返回语句。如下所示,函数在s 1、s 2相等时返回1,不相等时返回- 1。
wid
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( )函数所使用。最后,在第三行,返回值被丢弃不用,因为既没有把它赋给第一个变量,也没有把它用作表达式中的一部门。