![]() ![]() |
|
C语言程序设计(第4章函数) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:00:13 文章录入:杜斌 责任编辑:杜斌 | |
|
|
当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理: 首先,必须给函数以明确的类型说明符; 其次,函数类型的说明必须处于对它的首次调用之前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码。 4.1.1 函数的类型说明 可将函数说明为返回任何一种合法的C语言数据类型。 类型说明符告诉编译程序它返回什么类型的数据。这个信息对于程序能否正确运行关系极大,因为不同的数据有不同的长度和内部表示。 返回非整型数据的函数被使用之前,必须把它的类型向程序的其余部分说明。若不这样做,C语言的编译程序就认为函数是返回整型数据的函数,调用点又在函数类型说明之前,编译程序就会对调用生成错误代码。为了防止上述问题的出现,必须使用一个特别的说明语句。 [例4 - 1 ] float sum( ); / *函数说明* / main( ) { float first,s e c o n d ; first =123.23; second = 99.09; printf ("%f",sum (first,s e c o n d ) ); } float sum (a,b ) / * 函数定义* / float a,b; { return a+b; } 第一个函数的类型说明sum( )函数返回浮点类型的数据。这个说明使编译程序能够对sum( )的调用产生正确代码。 函数类型说明语句的一般形式是: type_specifier function_name ( ) ; 即使函数使用形参,也不要将其写入说明句。若未使用类型说明语句,函数返回的数据类型可能与调用者所要求的不一致,其结果是难以预料的。如果两者同处于一个文件中,编译程序可以发现该错误并停止编译。如果不在同一个文件中,编译程序无法发现这种错误。类型检查仅在编译中进行,链接和运行时均不检查。因此,必须十分细心以确保绝不发生上述错误。当被说明为整型的函数返回字符时,这个字符值被转换为整数。因为C语言以不加说明的方式进行字符型与整型之间的数据转换,因而多数情况下,返回字符值的函数并不是说明为返回字符值,而是由函数的这种字符型向整型的缺省类型转换隐含实现的。 4.1.2 返回语句 返回语句return有两个重要用途。第一,它使得内含它的那个函数立即退出,也就是使程序返回到调用语句处继续进行。第二,它可以用来回送一个数值。本章将说明这两个用途。 1. 从函数返回 函数可以用两种方法停止运行并返回到调用程序。第一种是在执行完函数的最后一个语句之后,从概念上讲,是遇到了函数的结束符“ }”(当然这个花括号实际上并不会出现在目标码中,但我们可以这样理解)。例如,下面的函数在屏幕上显示一个字符串。 [例4 - 2 ] pr_reverse () { char s[80]; / *定义一个字符数组* / scanf("%s",s); / *输入一个字符串,其长度不超过7 9个字符* / printf("%s\n",s); } 一旦字串显示完毕,函数就没事可做了,这时它返回到被调用处。 在实际情况中,没有多少函数是以这种缺省方式终止运行的。因为有时必须送回一个值,大多数函数用return语句终止运行,有时在函数中设立了多个终止点以简化函数、提高效率。切记,一个函数可以有多个返回语句。如下所示,函数在s1、s2相等时返回1,不相等时返回- 1。 [例4 - 3 ] find_char(s1,s2) char s1,s2; { if(s1 == s2) return 1; else return -1; } 2. 返回值 所有的函数,除了空值类型外,都返回一个数值(切记,空值是A N S I建议标准所做的扩展,也许并不适合读者手头的C编译程序)。该数值由返回语句确定。无返回语句时,返回值是0。这就意味着,只要函数没有被说明为空值,它就可以用在任何有效的C语言表达式中作为操作数。这样下面的表达式都是合法的C语言表达式。 x = power(y); if(max (x,y) >100) printf("greater");
for (ch=getchar( ); isdigit (ch);) . . . ; 可是,函数不能作为赋值对象,下列语句是错误的: swap(x,y) =100; C编译程序将认为这个语句是错误的,而且对含有这种错误语句的程序不予编译。 所有非空值的函数都会返回一个值。我们编写的程序中大部分函数属于三种类型。第一种类型是简单计算型—函数设计成对变量进行运算,并且返回计算值。计算型函数实际上是一个“纯”函数,例如sqr( )和sin( )。第二类函数处理信息,并且返回一个值,仅以此表示处理的成功或失败。例如write( ),用于向磁盘文件写信息。如果写操作成功了, write( )返回写入的字节数,当函数返回- 1时,标志写操作失败。最后一类函数没有明确的返回值。实际上这类函数是严格的过程型函数,不产生值。如果读者用的是符合A N S I建议标准的C编译程序,那么所有这一类函数应当被说明为空值类型。奇怪的是,那些并不产生令人感兴趣的结果的函数却无论如何也要返回某些东西。例如printf( )返回被写字符的个数。然而,很难找出一个真正检查这个返回值的程序。因此,虽然除了空值函数以外的所有函数都返回一个值,我们却不必非得去使用这个返回值。有关函数返回值的一个常见问题是:既然这个值是被返回的,我是不是必须把它赋给某个变量?回答是:不必。如果没有用它赋值,那它就被丢弃了。 请看下面的程序,它使用了mul( )函数。mul( )函数定义为:int mul(int x, int y){......} [例4 - 4 ] main( ) { int x,y,z; x = 10, y = 20; z = mul(x,y); /* 1 */ printf("%d",mul(x,y)); /* 2 */ mul(x,y); /* 3 */ } 在第一行, mul( )的返回值被赋予z,在第二行中,返回值实际上没有赋给任何变量,但被printf( )函数所使用。最后,在第三行,返回值被丢弃不用,因为既没有把它赋给第一个变量,也没有把它用作表达式中的一部分。 |
|
![]() ![]() |