Filename:[c/c++]分析c语言声明优先级规则
Version:V1.0
Date:12/09/2009
Author:S.C.Leon <[email protected]>
=====================================================================
先看几个例子:
1)请指出下列表达式的含义。
int *ap[];是指向数组的指针,抑或元素为int指针的数组?
int *fp();是指向函数的指针,抑或返回值是int指针的函数?
2)如果你能很快确定以上表达式的含义,那么再来看一下下面的式子。
char * const *(*next)();
char *(* c[10])(int **p);
你能确定以上表达式的含义么。
本文并不致力于研究茴香豆的写法,只是希望能够得到一种关于c语言优先级分析问题的统一解法,以能对复杂的c语言申明游刃有余。
这部分内容不在本文重点讨论范围之内,有兴趣可参考ANSI C标准。
A 声明从它的名字开始读取,然后按照优先级顺序依次读取(向右找到第一个非c语言关键字的标识符);
B 优先级从高到低依次是:
B.1 声明中被括号括起来的那部分;
B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组;
B.3 前缀操作符:星号*标识“指向……的指针”;
C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如int,long等),那么它作用于类型说明符,在其他情况下,const和(或)volatile关键字作用于它左边紧邻的指针星号。
示例一:char * const * (*next)();
A next ——next为声明的名字
B.1 (*next) ——next为一个指向……的指针
B.2 (*next)() ——next是一个函数指针
B.3 *(*next)() ——next是一个函数指针,这个函数返回一个指向……的指针
C char * const ——指向字符类型的常量指针
故 char * const *(*next)();的含义就是: next是一个函数指针,这个函数返回一个指向char型的常量指针
示例二:int(*foo())[];
自己先推导一下,然后看看结果结果:foo为一个函数,这个函数返回一个指向整型数组的指针。对不对呢?下面我们来看具体的推导过程:
A foo ——foo为声明的名字
B.2 foo() ——foo为一个函数
B.3 (*foo()) ——foo为一个函数,这个函数返回一个指向……的指针
B.2 (*foo())[] ——foo为一个函数,这个函数返回一个指向数组的指针
C int (*foo())[] ——foo为一个函数,这个函数返回一个指向元素为int型的数组的指针
让我们再用这个方法分析下本文开始提到的声明。
示例三:int *ap[];
A.ap——ap声明的名字;
B.2 ap[]——ap为一个数组;
B.3 *ap[]——ap为一个数组,这个数组中的元素为指针。
C int * ap[]——ap为一个数组,这个数组中的每个元素为int型的指针。
示例四:int *fp();
A.fp——fp声明的名字;
B.2 fp()——fp为一个函数;
B.3 *fp()——fp为一个函数,这个函数返回一个…的指针。
C int *fp()——fp为一个函数,这个函数返回一个int型的指针。
char * ( * n[10]) (int ** p)
A.n——n申明的名字;
B.2 n[10]——n[10]为一个数组;
B.3 *n[10]——n[10]为一个数组,数组中每个元素为指向…的指针。
B.2 (*n[10])(int **p)——n[10]为一个数组,数组中的每个元素为一个返回值是…的函数指针,函数接受一个指针的指针作为参数。
C char * ( * n[10]) (int ** p)——n[10]为一个数组,数组中的每个元素为一个函数指针,函数指针的返回值一个指向char型的指针,函数接受一个指针的指针作为参数
最后,有兴趣的朋友请试着解析利用以上提到的方法解析下式的声明
void (*signal(int sig,void(*func())(int)。
《C专家编程》Peter Van Der Linden等 人民邮电出版社