乐趣区

21天学习C语言-第五天

函数是 C 的核心和理念。
函数的定义
函数是一个有名字的独立代码块,这个代码块能完成指定的功能,有时候会返回值给调用程序。

函数有唯一的名称。
函数是独立的,函数能不被其他打断。
函数能完成指定的功能。
函数能返回值给调用程序。

函数如何工作
函数在被调用时执行,当一个函数被调用,调用者会把数据作为参数传给函数,参数被函数用来执行特定的逻辑,比如求平方。接下来函数内的语句开始执行,执行完毕后把所得到的结果返回给函数调用者。

函数和结构化
通过使用函数,可以实现结构化编程,把实现某一功能的代码独立出来,包装成函数,在需要的地方进行调用,上图的 square 就是这样的代码。
结构化的好处

把一个复杂的逻辑拆分成小的任务,代码可读性高。
调试起来简单,由于函数的独立性,可以快速定位到问题的位置。
增加以后的开发效率,也就是函数的可重用性,遇到重复或者相似的功能,代码可直接拿过来用。

如何结构化
确定要实现的目标,将目标细分为几步,每步是定为一个函数。如求平方中,总共有两步,确定要做的是求 2 的平方并打印出来。第一步是求平方,第二步是打印,因为打印是系统提供的函数,我们只把求的过程独立出来就好。
自上而下执行
函数按自上至下顺序执行(暂不说控制语句),执行完一个之后继续执行下一个。有的时候,main 函数中代码量很少,仅仅是调用函数的语句。实际实现功能的代码都在各个被调用的函数当中,就行菜单一样,main 函数只是相当于一个目录,真正的实现都在点击事件对应的函数当中。栗子, 逻辑都在 show 函数中执行:

写一个函数
写函数最重要的就是知道想要什么,有了目标,写函数就容易许多。函数由三部分组成,函数头,函数体和函数原型。有些时候,函数原型可以省略。
函数头
函数头由三部分组成,类型,名称和参数。

函数类型也就是函数执行后返回值的类型,可以是当前 C 中的任意类型比如 int,char 等。
函数名称是函数的唯一标识,可以随意叫什么,不过最好是能见名知意。
参数,多数函数都有参数,参数就是要处理的数据,参数需指明类型,多个参数用逗号隔开。

函数体
函数体是函数逻辑的具体实现部分,用大括号包裹,在函数头之后。一般包括局部变量声明,函数语句,和返回语句。

局部变量是在函数内部声明的,用于存储当前函数的临时数据。为了可读性,局部变量尽量不要和函数外部的变量重名。
函数语句是函数逻辑的具体实现部分,函数仍然可以调用其他函数。对于函数的长度,虽然没有限制,不过相对的短一些比较好。如果函数过长,那么函数执行的任务可能需要再次拆分。
返回值是函数对参数执行逻辑之后得出的最终结果,返回给调用者的值。

函数原型
函数原型的作用是将函数的类型,名称,参数信息告诉编译器,方便编译器对函数调用做检查。实验中发现,编译器会对类型,名称做严格的检查,如果不一致就会报错。参数检查比较复杂,函数原型的参数类型和对应函数的参数类型一定要相同,个数可以相同或者函数原型不写任何参数。但是函数原型如果有参数并且和函数的参数个数不等,则会报错。函数原型可以的参数可以不写名称,或者写其他名称。
调用函数
在需要的位置,写被调用函数的名称并在后面添加括号,括号内为函数需要的参数,如果函数不需要参数,括号置空即可。可以将函数的返回值赋值给变量,也可以作为其他函数的参数。递归是调用函数自身,在一些特殊的运算中会经常出现递归,比如求阶乘。递归比较耗资源,非必要的时候不要用。
函数位置
目前阶段比较简单,代码放在一个文件中就好。实际上,函数一般会分开不同的文件放置,在需要调用的地方引入头文件 (.h 文件)。比如 printf 函数,我们引入了 stdio.h 之后就能用,但是 printf 的函数并未在我们当前的文件中定义。
内联函数 (Inline Functions)
对于使用频繁并且体量小的函数,可以在函数前用 inline 关键字修饰。内联函数的作用就是在函数编译的时候将函数的内容整体复制到调用的位置,减少函数调用带来的资源消耗。很明显,内联函数会增加代码的编译时间和编译后程序的体量。inline 关键字要放在函数实现部分,放在函数原型前是没有作用的。

退出移动版