目录
一、函数的嵌套调用和链式访问
1、嵌套调用
2、链式访问
二、函数的声明和定义
1、函数的声明
2、函数的定义
声明和定义的拓展
拆成三个文件的好处
一、函数的嵌套调用和链式访问
当代码写的越来越多时,就会发现,其实一个程序都是由函数组成的,你调用我,我调用你,所以函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。
1、嵌套调用
什么是嵌套调用呢?来看看下面的代码:
注意,函数可以嵌套调用,但不能嵌套定义。
那什么是嵌套定义呢?举个例子大家就明白了
main函数也是函数,main函数只能调用Add函数,而不能定义在函数内部。
2、链式访问
把一个函数的放回值作为另外一个函数的参数。
举个例子:
那有的人就问,能不能不返回值len,直接把len替换成strlen("abcdef")呢?其实是可以的,让我们来看看程序运行的结果是否一样
程序结果还是6,这里就把strlen的返回值做了printf函数的参数,这就是链式访问。
接下来还有一个非常经典的例子:
大家可以先思考这个代码的结果是什么。
接下来我来解释一下为什么是这个答案(答案在解释后)
首先,我们可以在cplusplus这个网站搜索printf来查看它的返回值。
https://legacy.cplusplus.com/reference/cstdio/printf/?kw=printf
接下来我们从外向内分析,printf要打印一个整型,而这个整型是来自printf("%d", printf("%d", 43))的返回值,接下来的printf又要打印printf("%d", 43)的返回值。
所以首先程序会先打印43,打印完43之后就会打印printf("%d", printf("%d", 43))的返回值,而43的字符总数是2,所以会在屏幕中打印2,最后再打印整个printf("%d", printf("%d", printf("%d", 43)))的返回值,也就是1,所以最后会在屏幕上打印4321。
二、函数的声明和定义
1、函数的声明
●告诉编辑器有一个函数叫什么,参数是什么,放回类型是什么,但是具体是不是存在,函数声明决定不了。
●函数的声明一般出现在函数的使用之前。要满足先声明后使用。
●函数的声明一般要放在头文件中的。
有一部分人可能会把函数定义写在main函数后面,但我们要知道编辑器扫描代码是从上往下扫的,当扫到Add(a, b)发现前面没有见过Add函数,所以就会报错。
第二个警告大家现在可以暂时不理它。
那如何纠正错误呢,只要在main函数前声明就行了。
2、函数的定义
●函数的定义是指函数的具体实现,交待函数的功能实现。
●函数的定义也是一种特殊的声明。
像上面刚刚写的代码,可以直接把函数定义放到main函数前,是不是更加简洁。
声明和定义的拓展
其实我想告诉大家,实际上函数的声明和定义不是这样用的,上面的定义和声明只是语法展示。真正一个工程中,函数的定义和声明又是如何写的呢?我们接着往下看。
比方还是求两个数的和
首先先新建一个头文件(Add.h),然后再定义一个源文件(Add.c),接下来我把函数的定义放到Add.c中,对于函数的声明,我放到Add.h中。如果想使用Add函数,只需在text.c中加上#include "Add.h"即可。(函数的声明一般都放在头文件中,函数的定义(实现)放在源文件中)
注意#include只包含头文件,库里提供的函数用尖括号,自己写的头文件用双引号。
拆成三个文件的好处(了解)
最后,为什么一个.c文件就可以写完这些代码,而要把它拆成3个文件呢?其实它是有好处的。
①模块化开发(分工)
假设要写一个计算器程序,A程序员写加法,B程序员写减法,C程序员写乘法,D程序员写除法,如果没有多个文件设计,这些程序员都要在text.c中完成,这根本实现不了。有了多文件的设计,能够有效提高效率。
②代码的隐藏
略