完全免费版
第五章 函数和存储类
5.1.1 函数的定义
如果想调用一个函数完成某种功能,必须先按其功能来定义该函数。函数定义的格式如下所示:
<存储类说明><数据类型说明><函数名>(<参数表>) <参数说明> { <函数体> }
函数的定义可分两大部分:函数头和函数体。函数头包含(函数名>和(参数表)以及关于该函数的(存储类说明)、《数据类型说明),还有<参数说明).函数体是由一对花括号括起来的若干语句组成的,函数体内可以有一条语句或多条语句,也可以有复合语句,还可以是空,即该函数什么操作也不做,这是一个最简单的函数。(函数名)的起法同标识符,能够通过函数名来标明该函数的主要功能为最好。(函数名>后面跟一对圆括号,内有一个<参数表、,该'参数表)由一个或多个参数构成,多个参数之间用逗号分隔,也可以没有参数,但圆括号不可省略。定义瞬数时要对该函数的存储类和数据类型进行说明。函数的存储类有两种:外部函数和内部函数。外部函数用extern关键字加在函数名前面进行说明,常常省略,凡是不加存
储类说明的函数都是外部函数。内部函数必须在函数名前面加stai}c关健字进行说明,内部函数又称静态函数。函数的数据类型是该函数返回值的类型,函数的数据类型千一分丰富,一般C语言所允许的数据类型大多都可作为函数类型,个别的除外,如联合类型等。C语言规定,数据类型中除了
int型的可以不要说明外,其余各种类型都需说明。如果一个函数具有参数时,则需对参数的类型进行说明。<参数说明)一般放在函数名的下一行,有的编译系统(如Turbo G)可以把参数说明放在参数表中。
下面是函数定义的几个例子: Nothing() { }
该函数名字是nothing,它没有参数,它的函数体是空,该函数什么也不做。空函数可以用于调试中,它表明应该调用一个函数,但该函数尚未编好,先用一个空函数顶替。 void nopa() {
printf (\); }
该函数名是nops,该函数没有参数,因此不必进行参数说明,这
里,void关键字用来说明该函数没有返回值。该函数的函数体内仅有一个语句。 float max(x, y) float x, y; { float z z一x>y? x:y: return(z);
该函数名是max,它有两个参数x,y,它们都是float型数,由于该函数有参数,因此需要
参数说明:float x, y;该函数的数据类型为float型,这说明该函数有返回值,而返回值的类型是float型。该函数。无存储类的说明,这意味着该函数的存储类为外部的。该函数体是由3条语句组成的。这里有说明语句,它被放在执行语句的前面。 在函数的定义中还应注意如下几个问题:
(1)C语言中的函数可分为有返回值和无返回值两大类。在有返回值的函数定义中,除int型返回值外都必须对返回值的类型进行说明。在无返回值的函数定义中,可以加上无返回值的说明符void,也可以不加。这样,对于一个不加数据类型说明的函数可能是无返回值的,也可能是有int型返回值的。
(2)函数的定义不能嵌套。这就是说,不能在一个函数的函数体内再定义一个函数。例如,下列写法是错误的: fl(x,y) int x, y; ( f2(a,b) int a,b; {
Return(a十b); }
这种企图在f1()函数中再定义一个f2()函数的做法是错误的。但是,函数的调用允许嵌套。这就是说,可以在一个函数体内调用另一个函数,也可以进行自身调用(又称递归调用).
(3)如果一个函数的函数体中有变量的定义或说明时,一定要放在执行语句的前边,不可放在中间或后面,否则要出编泽错。 5.1.2 函数的说明
函数定义好后,在调用之前一般地要进行说明。函数的说明方法有如下两种:
一是只说明函数的类型,这称为简单说明。例如,对前面定义过的函数max说明如下:
float max();
这种说明可以单独一行,也可以与其他同类型的变量放在一起。 二是不仅说明函数的类型还要说明其参数的类型,这称为原型说明。例如,对前面己定义过的函数max ( )原型说明如一F: Boat max (float,float);
原型说明要比简单说明复杂一些,但是用原型说明后,在函数调用时系统将其参数的类型进行检查,如果发现不一致,则报错。如果用简单说明方法,则在调用时不作参数类型是否一致的检查,即使不一致也不报错,由此可见,原型说明比简单说明要安全些。 在实际使用中关于函数的说明还需注意如下几点:
(1)在下列情况下,函数在调用之前不必说明:在定义函数时没有加任何说明;或者是该函数无返回值义没有加void说明符;或者是该函数具有int型返回值而省略说明符。
(2) 助在下列情况下,函数在调用之前必须说明,如不说明,将出现编译错:即在定义函数时加了说明符,包含void在内,又是先调用后定义(即调用在定义之前),则调用之前必须说明。