记得第一次学C++中的函数时,它是被单独拿出来讲解的,大致上先介绍函数是什么,有什么形式,然后怎么用。我这里大致演示一下。

假设我们要得到一个两个整数的和的函数,于是首先开始就是函数声明:

int sum(int, int);

接着就是函数定义:

int sum(int number1, int number2)
{
return number1 + number2;
}

然后,就是函数的使用。

int main()
{
int result = sum(1, 2);
return EXIT_SUCCESS;
}

这一通操作下来,似乎已经对函数很熟了。但是,当看过如Python和JavaScript这些语言中对函数的处理之后,你应该会觉得函数在它们那里与在C语言这里简直就是两个完全不同的东西。一直以来,我都是这么认为的,直到最近看了M.K.King写的《C语言程序设计现代方法》(第2版·修订版)这本大部头之后,我对C/C++中的函数有了一些看法上的改变。

这本书里说了,函数的声明,定义,使用,本质上与变量的声明、定义、使用是一样的,也就是说,函数本身就是一个标识符而已。

以上面那个函数为例,函数的标识符(名字)是sum,然后它带有一个参数列表(int number1, int number2)以及一个返回值,还有一个所谓的函数体,但其实它是一个语句块,也就是说:

{   //语句块的开始
return number1 + number2;
} //语句块的结束

这段代码其实是独立的块。我不知道为什么,国内的教材很少提及语句块这个概念,也许是觉得没什么用处吧。但是,函数所谓的函数体确实就是一个语句块。

我们再看看变量的声明、定义、使用。

int i;   //声明
i = 100; //定义,也可以认为在这里是初始化
int j = i; //使用

函数的声明和变量的声明还算能比较容易对的上,就是多了一个参数列表。但是函数的定义与变量的定义却没那么容易对的上了,那么这时如果我更换一个不合语法的写法,估计就能对得上了。

function sum = (int number1, int number2) -> int {
return number1 + number2;
};

在这个语法下,函数和变量就没什么特别的差别了。


C语言中函数的语法特征与别的标识符有相当大的差别,这个现象让我思考两个问题:

1.为什么当年语言的设计者要这样做?

2.为何那么多教材都不对这个问题进行进一步的说明,让人产生错觉将函数当做一种非常特别的类型?

第1个问题,我认为最有可能的原因是,当年的语言就是流行这种风格,所以设计者没有必要标新立异,遵守“行业规范”是比较合理的。

那么第2个问题,我个人觉得可能的原因比较复杂了。

首先,国内的教材大部分都是特别“言简意赅”的类型,本着实用为主,不浪费纸张为原则,自然没有那么多笔墨来写这种“不重要”的旁枝末节。

其次,函数它最有价值的地方正好就是它能被调用,能接受输入并得到输出。这个特点确实与普通的变量有区别,将二者分割来讲解也是有一定的客观原因的。

最后,估计也是最根本的原因了,就是即使搞清楚了,也不会对实际使用时产生什么有价值的正面影响,相反还会增加理解成本,毕竟你平白无故地多了两个概念(标识符,语句块)。也就是说,不符合实用主义的需求。