函数介绍

函数的概念及分类

  C源程序是由函数组成的。函数是C源程序的基本模块,通过对函数的调用实现特定的功能。C语言不仅提供了极为丰富的库函数,还允许用户建立自己定义的函数。用户可吧自己的算法编成一个个相对独立的函数模块,然后用调用的方法来使用函数。可以说C程序的全部工作都是由哥总个样的函数完成的。所以也把C语言称为函数式语言。

函数的分类:

  1. 从函数的定义角度看,函数分为:库函数和用户自定义函数。

  库函数:由C系统􏰀供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该 函数原型的头文件即可在程序中直接调用。在前面各章的例题中反复用到 printf、scanf、getchar、putchar、gets、puts、strcat等函数均属此类。

  用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本 身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。

  2. 语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返 回值函数无返回值函数两种。

  有返回值函数:此类函数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。 如数学函数即属于此类函数。由用户定义的这种要返回函数值的函数,必须在函数定义和函数说 明中明确返回值的类型。

  无返回值函数:此类函数用于完成某项特定的处理任务,执行完成后不向调用者返回函数值。 这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回 为“空类型”,空类型的说明符为“void”。 

  3. 从主调函数和被调函数之间数据传送的角度看又可分为无参函数有参函数两种。 

  无参函数:函数定义、函数说明及函数调用中均不带参数。主调函数和被调函数之间不进行参数传送。此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。

参数传送。此类函数通常用来完成一组指定的功能,可以返回或不返回函数值。 

  有参函数:也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将 把实参的值传送给形参,供被调函数使用。 

 

C语言库函数分类:

  C语言􏰀供了极为丰富的库函数,这些库函数又可从功能角度作以下分类。

  字符类型分类函数:用于对字符按ASCII码分类:字母,数字,控制字符,分隔符,大小 写字母等。 转换函数:用于字符或字符串的转换;在字符量和各类数字量(整型,实型等)之间进行 转换;在大、小写之间进行转换。

  目录路径函数:用于文件目录和路径操作。 

  诊断函数:用于内部错误检测。 

  图形函数:用于屏幕管理和各种图形功能。 

  输入输出函数:用于完成输入输出功能。 

  接口函数:用于与DOS,BIOS和硬件的接口。 

  字符串函数:用于字符串操作和处理。 

  内存管理函数:用于内存管理。 

  数学函数:用于数学函数计算。 

  日期和时间函数:用于日期,时间转换操作。 

  进程控制函数:用于进程管理和控制。 

  其它函数:用于其它各种功能。

 

函数的优点:

1. 提高代码的可读性

2. 提高开发效率

3. 提高代码的复用性

 

函数的一般形式:

返回值类型  函数名(形参列表)

{  

  函数体;

  return 要返回的值;

注意点:

  1. 返回值为void的函数为无返回值类型函数,也叫空返回值类型函数,其函数体最后不需要return值,如果一定要写return,只能是return加分号,return后面不能跟任何形式的值。

  2. 函数名须符合用户自定义标识符的定义规则

  3. 形参列表可有可无,没有形参列表的函数成为无参数函数,调用该函数时不需要传递任何参数。有参数的函数,多个参数之间用逗号隔开,且必须定义参数的类型。调用函数时,传递的函数的参数,实参和形参类型必须一致。

  4. return 后面跟的值要和函数类型一致,否则会引起例如精度损失等问题。函数返回值的类型和return实际返回的值类型应保持一致。如果两者不一致,则以return实际 类型为准,自动进行类型转换。

  5. 函数名和其他函数名、变量名不能相同。

  6. 一个函数中可以有多个return,但只有一个有效。

  7. 函数值为整型,在函数定义时可以省去类型说明。 也就是说如果没有指定返回类型,那么C语言默认是int的类型(开发中不要省略返回值类型)

  

函数的参数

形参和实参

形参:在定义函数的时候,函数名后面小括号中的参数

  格式: 数据类型 变量 :int x;

  形式参数是什么样类型的数据,那么实际参数也必须是什么样的类型,形参变量只有在被调用时才分配内存单元

  形参的作用域:只能在本函数中使用,在函数中,不能定义和形参同名的变量

 

实参:调用函数的时候传递的参数,可以是变量,也可以是常量,也可是是表达式,还能是函数。 无论实参是何种类型的量,在进行函数调用时, 们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得 确定值。

   max(56,78); 5678就是两个实际参数

   

  形参和实参的功能是作数值的传递。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主 调函数向被调函数的数据传送。

    实参和形参在数量上类型上,顺序上应严格一致,否则会发生类型不匹配的错误。

 

参数的传递的过程

    1.实参的值拷贝一份放到函数形参中

    2.实参的值是一个已经确定的值

    3.类型要保持一致

    4.形参的值可以改,但是实参不会变

 

函数的返回值

  函数的值(或称函数返回值)是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。 

//被调函数返回给主调函数的值

  主调函数:A B两个函数 ,如果在A中调用了B,A叫主调函数,B被调函数

    return:被调函数返回给主调函数的值

    函数的返回值使用return 关键字进行返回

    1) return 0; return (0);  //括号可以省略

    2) return a+b; return a>b?a:b;   //可以是值也可以是表达式

    3) 如果函数的返回值是 void  return ;//(程序返回了,不再向下执行)

    4) 函数中可以有多个return ,但是只有一个起作用

    5)函数定义的返回值类型与return的值类型不一致,以定义的函数类型为准

    6)如果函数是整形,可以忽略返回值类型

 

函数的声明及调用

  调用某函数之前应对该被调函数进行说明(声明), 在主调函数中对被调函数作说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值作相应的处理。其一般形式为:

返回值类型 被调函数名( 类型 形参, 类型 形参... );

或为: 

返回值类型 被调函数名( 类型, 类型...); 

如:

int max( int a, int b ); int max( int, int ); 

注意

1) 如果被调函数的返回值是整型时,可以不对被调函数作说明,而直接调用。这时系统将自动对 被调函数返回值按整型处理。即如果被调函数是Int类型的,此时可以不用声明。

2) 当被调函数的函数定义出现在主调函数之前时,在主调函数中也可以不对被调函数再作说明而 直接调用。

原则:

    在调用函数之前,进行该函数的声明

    声明的方法:

    技巧:复制函数的头部,加上分号,写在调用调用方法之前 int max(int x,int y); //声明

函数的调用:

  函数名(实参列表);

1) 函数表达式(该函数必须是有返回值)

函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算。这种方式要求函数 是有返回值的.

int z=0;

z = max(23, 80)+1;

 

2) 函数语句

函数调用的一般形式加上分号即构成函数语句。

printf("%d",a); scanf("%d",&b);

 

3) 函数实参(该函数必须是有返回值)

函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送.

因此要求该函数必须是有返回值的。

printf("%d\n",max(20, 30));

 

4)函数名不能和变量名同名

5)C语言中允许函数内嵌套调用函数,但不允许函数内嵌套定义函数

 

递归函数介绍

  一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。

递归函数构成条件:

1)函数内自己调用自己

2)存在一个条件能够让递归结束

3)能让问题的规模能够缩小

递归的阶段:

  1. 递推阶段

  2. 回归迭代阶段

!* 递归函数内存开销很大,如果能用循环实现则不建议使用递归。

posted @ 2015-06-22 22:22  司英成·Owen  阅读(420)  评论(0编辑  收藏  举报