类型解释
写在前面
写这部分是为了:
- 读懂复杂且恶心的类型声明,比如
void (*signal(int, void (*fp)(int)))(int);
- 考试
记住要:
- 不写这种不符合规范,并且恶心他人的声明
- 多用
using
以及 STL 封装好的类型,适度用typedef
- 对恶心的写法说 no
推荐这个网站,能帮你把 C 类型声明翻译成自然语言:
变量声明说明符
本文中,我们只关心如下几种说明符,因为这几种说明符是最困难的部分:
*
: 指针[]
: 数组()
: 括号(改变声明优先级)或者 函数指针&
: 引用
优先级
括号括住的部分 > 后缀说明符 > 前缀说明符
读声明
优先级规律总结出来其实就是 右左法则
,或者叫 clockwise/spiral Rule
。
法则内容如下:
从唯一的未定义的标识符开始
声明语句中,有且仅有一个之前没定义过的标识符。我们就从这个标识符开始。
int ((*fp)[MAXN])(int x, int y);
上例就是 fp
。
先看右边的声明符,再看左边
因为后缀说明符优先级更高,所以先看右边。
将看到的声明符转译为英文
看到了哪个声明符,就将如下列出的翻译模板加到我们当前的翻译栈中。
指针 / 引用:a pointer / reference to
数组:an array of
函数:a function passing (params)
returning a
遇到非函数指针的括号就换方向
意思就是必须将当前括号里面的声明处理完毕才能跳出去。这是为了保证括号的优先级。
参考资料
c 语言中的复杂声明_c++ 数组复杂声明 读法-CSDN博客
parsing - C isn’t that hard: void ( *( *f[] ) () ) () - Stack Overflow
📝笔记:使用Clockwise/Spiral Rule技巧轻松读懂变量/函数声明 | RealCat