函数与预编译处理
目录:
- 函数的概念
- 函数的定义与调用
- 函数的参数传递
- 函数的嵌套调用和递归调用
- 内置函数
- 变量和函数属性
- 编译预处理
前言:
把实现某一特定功能的相关语句按某种格式组织在一起形成一个程序单位,并给程序单位取一个名称,这个程序单位就叫函数(function),给该程序单位所起的相应名称称为函数名。函数和类的出现可以将一个较大的复杂的问题化为小问题来解决,更方便管理程序。
1. 函数的概念
前面已经介绍了函数的概念。一个函数被使用时是指这个函数被调用时,函数调用通过调用语句实现,调用语句需要指定被调用函数的名字和调用该函数所需要的信息(参数)。调用语句所在的函数称为调用函数,简称为主调函数,被调用的函数称为被调函数。
一个C++程序可能包含多个函数,但是一个程序必须有且只有一个主函数,主函数的名字固定为main()且地位特殊,因为程序总从主函数开始启动执行。而且每个被调函数会返回一个结果给主调函数,如此一来,这个函数的调用层次可用一个图来表示:
有参函数和无参函数:
(1)无参函数。即调用函数时不需要用户给出参数的函数,再调用无参函数时,主调函数不需要向被调函数传递参数,被调函数一般是执行一组固定的函数。
(2)有参函数。即调用函数时,需要调用者给出参数的调用函数就是有参函数。这时,在主调函数和被调函数有数据传递,也就是主调函数把一些必要的数据传递给被调函数使用。
2. 函数的定义与调用
函数的定义:
类型标识符 函数名 ([形式参数列表])
{
声明语句
执行语句
}
说明:
(1)函数第一行的“类型标识符”位置应该写一个数据类型关键字,用来定义函数的返回值类型,如果无返回值用void定义。
(2)对于有参的函数一定在调用时注意参数的类型,如果有多个参数一定要注意参数的先后顺序,参数类型要对应上,这就是所说的“类型一致”。
函数声明:
声明的作用实际上是提前通知编译系统有什么函数将被调用。只有一些特殊情况下不需要声明:被调函数是自定义函数,而且该自定义函数出现在同一文件的主调函数之前。对于被调函数出现主调函数之后是需要声明的。
声明:
(1)对库函数的声明
对于库函数的声明语句已经写在有关包含文件中了,因此只要在程序文件开头用include语句将这些包含文件包含到本程序中来,就等于完成了对库函数的声明。
(2)对自定义函数的声明
必须在调用某自定义函数的语句出现之前,先写下声明语句:
函数原型的两种表现形式:
1.函数类型关键字 函数名 ([参数1类型],[参数2类型],[…])
2.函数类型关键字 函数名 ([参数1类型,标识符1],[参数2类型,标识符2],[…])
分析:
(1)对函数定义和申明是两回事,不要混淆。定义函数是建立一个函数,实现函数的功能,包括指定函数名、函数类型、形式参数类型及其名称、函数体等,它是一个完整的、独立的函数单位。而声明的作用是把函数的名称、函数的类型以及形式参数的个数、类型和顺序(注意:不包括函数体)通知编译系统,以便对包含函数调用的语句进行编译的时候,根据声明内容对函数进行检查。
(2)函数声明的位置。函数声明语句可以放在主调函数中,也可以放在函数外面,只要在调用语句之前声明就有效。声明语句也可以放在程序的最前面。例如:
//对函数进行声明
char f1(char,char);
float f2(float,int);
int f3(int