c语言标识符书写(如何阅读C语言的声明语法)
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);
可以解释为:
指向返回int的函数(参数为int a)的指针的数组(元素个数10)
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com