int main(int argc, char* argv[])
日常生活中,要完成一件复杂的功能,我们总是习惯把“大功能”分解为多个“小功能”以实现。在C++程序的世界里,“功能”可称呼为“函数”,因此“函数”其实就是一段实现了某种功能的代码,并且可以供其它代码调用。
一个程序,无论复杂或简单,总体上都是一个“函数”;这个函数就称为“main
函数”,也就是“主函数”。比如有个“做菜”程序,那么“做菜”这个过程就是“主函数”。在主函数中,根据情况,你可能还需要调用“买菜,切菜,炒菜”等子函数。
接下来的问题是,“到底是谁调用你去做菜”?也许是夫人的命令,也许是自己的确饿了;但不管如何,你做菜总是因为有人要求你去做。A要求B去做某事,这称为“A调用B”。对程序来说,调用它们的人就是“操作系统”。我们画一个“调用”过程图来加深理解。

(函数调用示意图)
图中带箭头的线,用于表示“调用”。
“操作系统”——先认为就是我们常用的“Windows”系统,为什么要“调用”一个程序呢?这不难说清,比如有个人今天很无聊,决定玩个“挖地雷”的游戏,于是该人在开始菜单里,找到附件,再找到“挖雷”程序,用鼠标一点!得,这其实是该人向发出一个命令:“请运行挖雷程序吧!”,于是“Windows”就调用“挖雷”程序。这就是一个例子:由最终用户发起的调用。当然,并不一定是由“人”来发起最初的调用;也可以Windows本身,还可以是一个“程序”去调用另一个“程序”,比如“病毒程序”去调用格式化硬盘的程序……这些暂时不是我们所关心的,所以我们只从操作系统调用这里说起。
上图中,我们把“老婆大人”比喻成“操作系统”,由她去调用“做菜”这道程序,而做菜程序被当成“主函数”,该主函数又去按照既定的顺序,调用各个子函数。
操作系统的地位很高,所以它事先规定,任何程序都必须有一个“入口”,这样操作系统才能从这个入口“进入”到程序内部开始执行代码
,这个“入口”,就是主函数。
本图也同样表达了一件大“功能”,被分解为“小功能”的过程。即“主函数”调用子函数,子函数又调用了“子子函数”。
不过大家不要被我误导,事实上没有“子子函数”这种说法。考虑一种情况:子函数A可以调用子函数B,而子函数B又可以调C函数,最后C函数可反过来调用A函数(称为递归调用),那么谁是“子”谁是“父”难以定义,因此,只要不是主函数,在调用关系上,我们都统称为“子函数”,甚至就叫为“函数”。关心一函数位于第几层调用关系,并没有多大的意义。
言归正传。函数名之后跟随了一对花括号{
},花括号之间是数行代码;这些代码组合起就是函数所要完成的功能;它们可以是直接实现功能的代码,也可以是调用其它子函数的代码。
| |
void foo () |
--> 函数头 |
| |
{
...
} |
--> 函数体 |
作业:
- 一个程序,最初的调用者是谁?
- 为什么不提倡“子子函数”这种说法?
- 以下函数代码,其函数名是什么?函数体包括哪些行?
int add(int a, int b)
{
return (a + b);
}