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》
这是本不错的书哟,建议没有看过的人去弄来看一下。
C语言复杂类型声明怎么理解?
最新推荐文章于 2022-07-27 20:50:14 发布
