函数代表一段可以复用的代码 ,其存在的意义和价值在于可以大最减少编程中重复 码出现的数量,只需要把这些重复的代码段写成函数,每个函数用于实现一个相对独立和短小的功能,当需要对应功能的时候,可以直接通过调用这些函数来实现,此外,还可以通过给函数传递不同的参数来控制函数的各种执行行为。所以,函数的使用非常灵活、方便。
C++函数功能就相当于Mind+ 里的积木块,可以复用。
递归调用,是函数调用中一个相对不易理解的概念,在这一章中会有深入细致的讨论和一个非常生动实用的游戏开发案例。
此外,在这一章中,因为函数作为一个相对独立的功能或者说是程序片段的存在,也引申出了局部变量和全局变量的概念 ,并进一步详谈局部和全局变量的生存周期问题以及全局变量的跨文件访问问题。
一、函数的基本概念和定义
1、函数的基本概念
到目前为止,例子都是写在 main 函数里中,main 函数是整个程序执行的人口函数,程序先从这个函数开始执行。
在程序设计中,经常将一些常用的功能模块编写成函数,目的是减少重复编写程序代码带来的工作量。
一般来说,一个C程序 , 由一个主函数(main 函数)和若干个其他函数构成,主函数可以调用其他函数,其他函数之间也可以互相调用,同一个函数可以被一个或者多个函数调用任意多次。
简单来说 ,可以这样理解,以往用过的printf 就是一个函数,这个函数的目的是在屏幕上输出需要的内容。
例:在main中写代码,同时写了一个名字叫作printHello 的函数。
printHello 函数必须在main 函数上面去创建,否则会报错。因为程序从 main 函数开始执行,如果把printHello 函数写在main 函数的下面,就找不到 printHello函数,所以会报错。以后会讲解如何不把函数提到上面去写,也能让 main找到这个函数, 现在只得要记住,printHello函数必须提到main上而去写,这样 main才能找到 printHello函数。
说明:
(1)一个文件会包含一到多个函数,这个文件就称为一个源程序(源代码)文件。比如,在代码写在 xxx.cpp文件中,就是一个源程序文件。
(2)对于大型项目,不会把所有源代码都放在一个文件中 ,那样这个文件包含的代码行就太多了 ,所以一个 C项目是由一个或者多个源程序文件组成 ,函数可以分别放到这些源程序文件中,并可以被其他源程序文件中的函数所调用(共用)。以后会讲解如何书写多个源程序文件。
(3)C程序从main函数开始执行,最终也是在 main函数中结束整个程序的执行,而main 函敛由系统来调用,其名字是固定的,开发者需要做的是书写 main函数中的内容。
(4)函数不能嵌套 ,不能在一个函数内部套另外一个函数,函数之间能够互相调用,但不要调用 main 函数,否则会产生意想不到的问题,比如执行代码时产生异常,main 函数是留给系统来调动的。? ?
(5)函数一般分为两类:
库函数,如printf,特点是直接使用,不需要自己定义。
自定义函数,如上面例子中的 printHello 函数,就是开发者自己写的,所以叫自定义。
2、函数的的定义和返回值
首先介绍一下“函数参数”的概念,就是调用函数时,希望把一些数据传递给这个函数,这个时候,函数就得要用一些变量来接收这些传递过来的数据,这些接收数据的变量,就叫函数参数。
函数定义的一般形式如下,其中大括号{ }包着的部分又称为函数体。
返同类型 函数名(形式参数列表){
一条或多条语句......
return 返回值;
}
上述函数定义的一般形式中, 函数后面圆括号内部的参数(1个或多个)叫作形式参数,简称形参。这里,将通过各种例子把函数的一般形式展现出来。
1)函数无返回类型无形参
例:
这里必须记住,如果一个函数不需要返回任何信息,则"返回类型"这里必须写为 void,这是固定写法。
2)有返回值有形参
上面这个函数的参数存在的意义是有数据要传递到这个函数中来,用这些参数来接收,这些参数(如 a 和 b)叫形参,调用add函数的方法如下:
说明:
(1)函数定义的第一行末尾没有分号,千万不要写成int add(int a.int b);
(2)调用这个函数时,会为函数的形参分配内存,函数调用结束后,形参的内存会被释放,所以形参只能在函数内部使用。
(3)函数调用时传递给函数的参数称为实际参数,简称实参,实参可以是常量、变量、表达式。
例:
函数调用时,实参的值就自动赋给了形参,如果实参和形参为数组名(数组名代表的是数组首地址),则传递的是数组首地址。对于这个话题,后面还会详细介绍。
(4)形参数量、类型要和实参数量、类型保持一致。
(5)C语言规定,实参变量对形参变量的数据传递是"值传递" 也就是单向传递,只由实参传递给形参,不能由形参传递给实参。有些例外的情形,暂时还不在讨论之中,目前只需要记住,参数传递的方式是单向值传递即可。
(6)下面对函数的调用之后 ,实参的值会传递给形参,这并不会改变实参i,j的值, 因为函数参数的传递是“单向值传递”。
int result=add(i,j);
(7)函数如果有返回值,则函数里面一定会用 return 语句返回这个值,函数外面调用者所在行可以用赋值语句接收函数的返回值。如果一个函数不需要返回任何值,则在该函数中可以不写 return 语句。
例:返回表达式的值。
例:根据不同条件有多个 return 语句。
例:如果实际返回的类型和函数定义的返回类型不一致,则系统会自动将返回的类型转成“函数返回值类型”,但不建议写这样的代码。