现在的位置: 首页 > 综合 > 正文

[c/c++]分析c语言声明优先级规则

2013年05月31日 ⁄ 综合 ⁄ 共 1760字 ⁄ 字号 评论关闭

 

Filename[c/c++]分析c语言声明优先级规则

VersionV1.0

Date12/09/2009

AuthorS.C.Leon <leonsc@126.com>

=====================================================================

一、问题的引入:

先看几个例子:

1)请指出下列表达式的含义。

int *ap[];是指向数组的指针,抑或元素为int指针的数组?

int *fp();是指向函数的指针,抑或返回值是int指针的函数?

2)如果你能很快确定以上表达式的含义,那么再来看一下下面的式子。

char * const *(*next)();

char *(* c[10])(int **p);

你能确定以上表达式的含义么。

本文并不致力于研究茴香豆的写法,只是希望能够得到一种关于c语言优先级分析问题的统一解法,以能对复杂的c语言申明游刃有余。

 

二、C语言申明构成

这部分内容不在本文重点讨论范围之内,有兴趣可参考ANSI C标准。

 

三、C语言优先级解析规则

A 声明从它的名字开始读取,然后按照优先级顺序依次读取(向右找到第一个非c语言关键字的标识符);

B 优先级从高到低依次是:

B.1 声明中被括号括起来的那部分;

B.2 后缀操作符:括号()表示这是一个函数,而方括号[]表示这是一个数组;

B.3 前缀操作符:星号*标识指向……的指针

C 如果const和(或者)volatile关键字的后面紧跟类型说明符(如intlong等),那么它作用于类型说明符,在其他情况下,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 人民邮电出版社

抱歉!评论已关闭.