注册 登录
LUPA开源社区 返回首页

jiang001的个人空间 http://www.lupaworld.com/?263754 [收藏] [复制] [分享] [RSS]

我的博客

深入浅出Linux工具与编程:函数的调用

已有 1594 次阅读2011-7-6 15:32 |系统分类:IT技术

函数的基本思想为将一个大的程序按功能分割成一些小模块。

  函数特点为各模块相对独立、功能单一、结构清晰、接口简单,控制了程序设计的复杂性,提高元件的可靠性,缩短开发周期,避免程序开发的重复劳动,易于维护和功能扩充。函数开发方法为自上向下、逐步分解、分而治之。

  C是函数式语言,必须有且只能有一个名为main的主函数,C程序的执行总是从main函数开始,在main中结束,函数不能嵌套定义,可以嵌套调用。

  函数分类从用户角度可分为标准函数(库函数)和用户自定义函数。从函数调用或被调用形式上可分为有参函数和无参函数。从返回值上可划分为有返回值函数和无返回值函数,无返回值函数需要在函数名前加void关键字。

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

  使用库函数时应注意函数功能、函数参数的数目和顺序、各参数的意义和类型、函数返回值意义和类型、需要包含的头文件。

  函数的返回值形式为:return(表达式)、return 表达式、 return三种。返回的作用是使程序控制从被调用函数返回到调用函数中,同时把返回值带给调用函数。函数中可有多个return语句(但良好的设计应保持只有一个return语句),若无return语句,遇}时,自动返回调用函数,若函数类型与return语句中表达式值的类型不一致,按照函数类型为准进行自动转换。函数返回值类型默认为int型。

  函数调用形式为“函数名(实参表)”,调用时要求函数的实参与形参个数相等、类型一致、按顺序一一对应。

  在同一文件,使用后面的函数(除返回值是int类型和void类型而且不带形参的函数)需要在文件头进行声明。如果有多个源文件,也可以把函数声明放在一个单独的头文件中,其他源文件包含此头文件。

  从用户角度划分函数

  从用户角度可划分为库函数和用户自定义函数,具体说明如下:

  ① 库函数:由C系统提供,用户无须定义,也不必在程序中做类型说明,只须在程序前包含有该函数原型的头文件即可在程序中直接调用,如printf、scanf、strcpy、strcat等函数均属此类。

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

  从功能角度划分函数

  从功能角度可以把C语言函数划分为如下13类:

  ① 字符类型测试函数:用于对字符类型进行测试。

  ② 转换函数:用于字符或字符串的转换,在字符量和各类数字量(整型、实型等)之间进行转换。

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

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

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

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

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

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

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

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

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

  ⑫ 文件操作函数:用于对文件的操作。

  ⑬ 其他函数:用于其他各种功能的操作。

  

函数调用简述

  函数声明是说明函数的调用形式,函数声明必须是已存在的函数。使用库函数须要包含对应的头文件,包含方法为#include <*.h>。使用用户自定义函数需在文件内进行函数声明或将函数声明放在自定义头文件中然后进行包含,包含用户自定义头文件方法为#include "*.h"。

  函数声明的一般形式为:“函数类型 函数名(形参类型 [形参名],…)”或“函数类型 函数名()”。函数声明的作用是告诉编译系统函数类型、参数个数及类型,以便检验。函数定义与函数声明不同,函数定义是函数的实现,函数声明是说明函数的调用形式,方便其他程序按接口调用。函数声明位置可在函数内或外。

  函数调用时实参必须有确定的值,形参必须指定类型,形参与实参类型一致,个数相同。若形参与实参类型不一致,自动按形参类型转换。形参在函数被调用前不占内存,函数调用时为形参分配内存,调用结束,内存释放。

  函数定义不可嵌套,但可以嵌套调用函数。

  函数调用的方式

  函数调用有如下三种方式:

  ① 函数表达式:函数作为表达式中的一项出现在表达式中,以函数返回值参与表达式的运算,这种方式要求函数是有返回值的。例如,z=max(x,y)是一个赋值表达式,把max的返回值赋予变量z。

  ② 函数语句:函数调用的一般形式加上分号即构成函数语句。例如,printf ("%d",a)和scanf ("%d",&b)都是以函数语句的方式调用函数。

  ③ 函数实参:函数作为另一个函数调用的实际参数出现。这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的。例如,printf("%d",max(x,y)) ,即把max调用的返回值又作为printf函数实参来使用。在函数调用中还应该注意的一个问题是求值顺序的问题,所谓求值顺序是指对实参表中各量是自左至右使用还是自右至左使用,对此,各系统的规定不一定相同。

  被调用函数的声明

  在主调函数中调用某函数之前应对该被调函数进行声明,这与使用变量之前要先进行变量说明是一样的。在主调函数中对被调函数做说明的目的是使编译系统知道被调函数返回值的类型,以便在主调函数中按此种类型对返回值做相应的处理。

  其一般形式为:

  类型说明符 被调函数名(类型 形参,类型 形参……) ;

  或为:

  类型说明符 被调函数名(类型,类型……) ;

  函数声明时圆括号内需给出形参类型和形参名,或只给出形参类型,这便于编译系统进行检错,以防止可能出现的错误。

  例如,main函数中对max函数的说明如下:

  int max(int a,int b);

  或写为:

  int max(int,int) ;

  C语言中规定在以下几种情况时,可以省去函数声明。

  ① 如果被调函数的返回值是int或void类型且没有形参时,可以不对被调函数做说明,而直接调用,这时系统将自动对被调函数返回值按整型处理。但不提倡不进行声明。

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

  ③ 如在所有函数定义之前或头文件中对函数原型进行了声明,则在以后的各主调函数中,可不再对被调函数做说明。

  函数的递归调用

  一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。C语言允许函数的递归调用,在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。直到碰到结束条件然后递归返回。递归的次数是有限的,常用的办法是加条件判断,满足某种条件后就不再做递归调用,然后逐层返回。

 已同步至 jiang001的微博

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册
验证问答 换一个 验证码 换一个

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部