C语言复杂类型声明怎么理解?

来源:互联网 发布:二级域名系统源码 编辑:程序博客网 时间:2024/04/29 18:09
Q : 请问float (*op[4])(float a,float b)是什么意思?C语言的复杂语法声明具体应该怎样分析? 主要解答者: plusKid 提交人: bngfcy 感谢: plusKid、jimychen、yangsongx 审核者: Flood1984 社区对应贴子: 查看 A : 声明: float (*op[4])(float a,float b); 代表的是什么意思呢? --------------------------------------------------------------- next是一个指针,它指向一个函数,该函数返回另外一个指针,该指针【函数返回的】指向一个类型为char的常量指针。 --------------------------------------------------------------- 指向函数的指针数组!! --------------------------------------------------------------- 声明是正确的 --------------------------------------------------------------- 大家都对C语言那种只有编译器才喜欢的声明语法感到头痛,其实其中是有规律的。 只要按照声明的优先级一步一步的分析就可以了。 C语言的声明的优先级规则如下: --------------------------------------------------------------- A 声明从它的名字开始读取,然后按照优先级顺序依次读取 B 优先级从高到低依次是: B.1 声明中被括号括起来的那一部分 B.2 后缀操作符【圆括号()表示这是一个函数,方括号[]表 示这是一个数组】 B.3 前缀操作符【*表示这是一个指向……的指针】 C 如果const或volatile关键字的后面紧跟说明符【如int、long等】, 那么它作用于类型说明符。在其他情况下,const和【或】volatile 关键字作用于它左边紧邻的指针星号。 ---------------------------------------------------------------- 下面看一个例子: char * const *(*next)(); -------- ------------------------------------------------------ 运用规则 解释 -------- ------------------------------------------------------ A 首先,看变量名“next”,并注意到它直接被括号括住 B.1 先把括号里面的东西看成一个整体,得出“next是一个指向…… 的指针” B 然后考虑括号外面的东西,在星号前缀和括号后缀之间做出选择 B.2 B.2规则告诉我们优先级较高的是右边的函数括号,所以得出“next 是一个函数指针,指向一个返回……的函数” B.3 然后,处理前缀“*”,得出指针所指的内容 C 最后,把“char* const”解释为指向字符的常量指针 -------- ------------------------------------------------------ 经过上述分析,得出“next是一个指针,它指向一个函数,该函数返回另外一个 指针,该指针【函数返回的】指向一个类型为char的常量指针”。 千万不要嫌麻烦,习惯了之后就会很自然地看出各种声明了,例如你问的那个: float (*op[4])(float a,float b); 用上面的步骤,可以得出“op是个含有四个元素的数组,它的元素的类型是指针, 该指针是函数指针,该函数接受两个float参数,并返回float。” 其实,运用上面的规则,可以很容易地编写出一个分析C语言声明的小程序,这里 有一个现成的可以用,它把C语言的声明翻译成英语【不要嫌代码太乱,已经稍微 整理了一下,毕竟这是国际C语言混乱代码大赛的获奖作品嘛。^_^】: cdecl.c ------------------------------------------------------------------ #include #include #define w printf #define p while #define t(s) (W = T(s)) char *X,*B,*L,I[99]; M,W,V; D() { W == 9?(w("'%.*s'is ",V,X),t(0)):W == 40?(t(0),D(),t(41)):W == 42?(t(0),D(),w("ptr to ")):0; p(W == 40?(t(0),w("func returning "),t(41)):W == 91?(t(0) == 32?(w("array[0..%d] of ",atoi(X)-1),t(0)):w("array of "),t(93)):0); } main() { p(w("input: "),B = gets(I))if(t(0) == 9)L = X,M = V,t(0),D(),w("%.*s./n/n",M,L); } T(s) { if(!s ¦ ¦ s == W) { p(*B == 9 ¦ ¦ *B == 32)B++; X = B; V = 0; if(W = isalpha(*B)?9:isdigit(*B)?32:*B++)if(W < 32)p(isalnum(*B))B++,V++; } return W; } ------------------------------------------------------------------ 以上内容整理自《Expert C Programming》 这是本不错的书哟,建议没有看过的人去弄来看一下。