编程入门之函数理解

  在学习C语言编程时,总会提到C是面向过程编程,与面向对象编程对应的。面向过程编程总是显得低人一等,需要控制程序执行的每个过程,面向对象编程,只要实现了类之后,调用非常方便一样。在C++的发展下,C好像越来越不入流了,更不用说C指针的各种问题,内存泄漏和越界访问数据,这一切好像只有在C语言中才存在。但是C++也是存在的,作为C的超集语言,C++最大的问题就是太完备了,太复杂了,这一切的一切就是可能需要几年才能真正入门C++。在Java和Python的比较下,C也是有自己优势的,可以面向硬件编程,控制程序执行的每一个过程,接近汇编语言的效率,和汇编语言的零距离融合,内链函数的应用,bootloader的应用,驱动程序的编写,嵌入式设备的兴起,物联网的崛起、工业革命这一切都是C的契机,无法想象,没有C语言,生活会变成什么样子,因此C语言还是值得学的。

  学习C语言的都知道,C语言的核心之一就是函数,函数包括函数签名和函数体。

一、函数的签名与函数体:函数签名--函数的类型、函数的名称、函数的参数列表

  1、函数的类型:函数的返回值类型,可以是基本类型或符合类型,也可以是void类型(表示没有返回值);

  2、函数的名称:标识符常常用动名结构的短语,能表明函数的功能最好,不要和已有的函数重名即可;

  3、函数的参数列表:可以在调用函数时传入的参数,参数列表包括传入参数的类型和传入参数的顺序;

  4、函数体:本质是语句块,完成代码的初级封装,决定了变量的作用域和程序的执行时序;

二、函数的接口化,将一个功能用一个头文件和实现模块化:

  1、将数据定义和函数声明放置到头文件中;

  2、在头文件中说明函数的功能、函数的调用方法、函数的传参要求和函数的错误代码,便于用户使用该模块;

  3、在模块对应的实现文件中包含模块的头文件,方便数据的应用;

  4、实现对应函数的功能,建议函数不要超过2×24=48行代码,逻辑必须简单也可以;

  5、有条件时应该附上测试函数的应用及测试方法等;

  6、函数没有返回值也可以调用return语句,如果没有ruturn语句,在碰到}后,编译器会执行返回语句;

  7、函数实现过程中,尽量避免Dead Code(永远都无法执行的代码);

  8、函数实现过程中,不应该出现大量重复代码,否则,应该抽象出一个函数封装重复代码;

三、函数的调用,除了main()由系统调用外,其他函数原则上都是有main函数调用的;

  1、调用没有返回值的函数,通常用来实现数据的输出或程序状态的改变,无需返回值,直接functionName(实参);

  2、调用有返回值的函数,需定义与函数类型相同的变量,完成函数返回数据的接受工作,type typeData = functionName(参数);

  3、调用函数原则上只能有一个返回值,如果需要返回多个函数,可以考虑返回指针、数组或符合类型等;

  4、调用函数时传入的实参的类型和顺序及数量必须与形参完全一致;

  5、通过调用函数,实现程序执行细节和数据操作的动作隐藏;

四、增量式开发,实现代码从零开始到功能实现的过程:

  1、模块划分,复杂功能分割成小功能的模块,最终到只需要简单几个语句就能完成功能的小模块即可;

  2、功能具体化;

  3、搭建函数的实现模板;

  4、填充必要的代码实现;

  5、实现代码功能的测试,如果功能正常,则代码实现正常;

  6、代码测试功能不正常,引入临时变量并添加附加的语句,实现数据的监控,修改必要代码,直至代码功能正常;

  7、将附加语句注释,保留必要核心代码即可;

  8、添加必要的注释,完成代码的完善即可。

五、代码重构,主要实现代码的优化和透明化修改:

  1、代码重构时,尽量不要删除已有的实现,可以再次实现;

  2、代码重构时,可以添加新的功能;

  3、代码重构时应实现代码应用的透明化;

六、递归,概念自身在定义时用到概念本身,

  1、递归的首要条件是基础条件;

  2、递归的必须条件是递归方法;

  3、递归的必要条件是递归规模减小的方法;

  

原文地址:https://www.cnblogs.com/guochaoxxl/p/10821895.html