C语言中如果有声明:int (*func_p)(double);怎样解读呢?

C语言的声明不能从左往右按顺序解读(无论是英文还是中文),而是左右来回解读。

在C语言中,变量的声明仿效表达式的语法。可是,勉强地去模拟本质上完全不同的事物,结果就是“四不像”。“使声明的形式和使用的形式相似”是C(还有从C派生的C 、Java等语言)特有的奇怪语法。

在Pascal中,C的int vari[10]可以这样声明:

var vari : array[0..9] of integer;

这种声明,从左向右用英语按顺序解读是完全没有问题的。

C的作者Dennis Ritchie在C语言后开发了一种叫Limbo的语言。Limbo中各种标记的使用方法,一眼就可以看出来和C非常相似,但是声明语法完全设计成Pascal风格。这也表明作者自身也在反省C语言的声明语法。

C语言的声明语法应该是以标识符为中心,左右来回解读。

1 首先着眼于标识符(变量名或函数名)。

2 从距离标识符最近的地方开始,依照优先顺序解释派生类型(指针、数组和函数)。优先顺序说明如下:

2.1 用于整理声明内容的括弧,一般是用于强制类型转型;

2.2 用于表示数组的[],用于表示函数的()

2.3 用于表示指针的*

3 解释完成派生类型,使用“of”、“to”、“returning”将它们连接起来;

4 最后,追求数据修饰符(在左边,如int、double,这里暂未考虑const和volatile);

数组元素个数和函数的参数属于类型的一部分。应该将它们作为附属于类型的属性进行解释。

5 解读:int (*func_p)(double);

5.1 着眼于标识符,英语的表达是:func_p is;

5.2 因为有括住标识符的括号,这里着眼于*,英语的表达是:func_p is pointer to;

5.3 解释于函数的(),参数是double,英语的表达是:func_p is pointer to function(double) returning;

5.4 最后,解释数据类型修饰符int,英语的表达是:func_p is pointer to function(double) returning int,翻译成中文就是:func_p是指向返回int的函数的指针。

6 使用和上面相同的方式,我们对各种各样的声明进行解读,如下表:

C语言声明英语表达
int vari;vari is int
int vari[10];vari is array of int
int vari[10][3];vari is array of array(3 elements) of int
int *vari[10]vari is array(10 elements) of pointer to int
int(*vari)[3];vari is pointer to array(3 elements) of int
int func(int vari);func is function(pararmeter is int vari) returning int
int (*func)(int vari);func is pointer to function(pararmeter is int vari) returning int

7 图解:int (*func_table[10])(int a);

c语言标识符书写(如何阅读C语言的声明语法)(1)

可以解释为:

指向返回int的函数(参数为int a)的指针的数组(元素个数10)

,