如何读懂 C 语言复杂的声明
作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢!
参考<<C专家编程>>
废话
虽说 C 语言相比于其他更高级的语言来讲,有着非常精简的语法结构,对于初学者非常的友好。 然而,使用 C 语言依然可以可以写出非常难懂的代码, 也许这也就是精简的语法所必须面对的缺点吧。 笔者就经常一些复杂的声明,看得一头雾水,这里就分享一个帮你读懂这些声明的技巧吧。
自测
先自己测试一下, 如下的声明你能读懂吗?
void (*signal(int sig, void(*func)(int))) (int); // 当然,比这个复杂的声明还有很多...
技巧
要读懂一个声明,必须要懂得其中的优先级规则。
优先级规则如下:
A: 声明从它的名字开始读起, 然后按照优先级顺序依次读取
B: 优先级从高到低依次是:
B.1: 声明中括号括起来的部分
B.2: 后缀操作符:
括号 () 表示这是一个函数
方括号 [] 表示这是一个数组
B.3: 前缀操作符: 星号 * 表示 “指向…的指针”
C: 如果 const 和 ( 或 ) volatile 关键字的后边紧跟类型说明符(如 long 等), 那么它作用于类型说明符。
在其他情况下,const 和 ( 或 ) volatile 关键字作用于它左边紧邻的指针星号
示例
例1:
char * const *(*next)();
- 首先,变量名为 next
- 这里优先级最高的就是括号了。 括号中 \*next 为一个整体,具有最高优先级。 由 B.3 可以得知 "next 是一个指向 ... 的指针"
- 除括号外,最高优先级为后缀操作符,这里有括号紧跟着 (\*next)。 由 B.2 可知 "next 是一个函数指针,被指向的函数没有输入参数, 返回值还需要进一步分析"
- 接下来最高优先级的结构应该是 (\*next) 的前缀操作符------星号\*。 这里需要进一步分析更前面的结构
- 最后,我们应该将 "char \* const \*" 解释为一个结构。 由 C 可知它的意义为 "指向字符的常量指针"
总结,这个声明的含义为: next 是一个函数指针, 该函数指针指向的函数无输入参数且返回一个指向字符的常量指针
例2:
void (*signal(int sig, void(*func)(int))) (int); // 当然,比这个复杂的声明还有很多...
这就是我们前面提到的声明,我们来试着分析一下。
- 首先,变量名是 signal
- 其次就是括号了。 括号中 (\*signal(int sig, void(\*func)(int))) 为一个整体。 signal 前有星号,它的意义是 "signal 是一个指向 ... 的指针"
- 接着 signal 后有括号,标志着 signal 是一个函数指针,它有一些复杂的参数和不易分析的返回值。
- signal 函数指针指向的函数具有两个参数, 一个是 int sig, 一个是 void(\*func)(int)。
- void(\*func)(int) 表示一个函数指针,被指向的函数接收一个 int 参数返回值为 void。
- 接着就是最后的那个 (int), 它和最前面的 void 一起表示 signal 指向的函数返回一个函数指针。 后者所指向的函数接受一个 int 参数并返回 void.
总结, 这个声明的含义为: signal 是一个函数指针,它返回一个接收一个 int 参数并返回 void 的函数指针。而 signal 函数接收一个 int 和一个函数指针作为参数。 第二个参数所指向的函数接收一个 int 参数并返回 void
哈哈,其实我想说,即使我们分析清楚了这个声明的意义,它依旧像魔鬼一样难以理解。
欢迎交流任何想法.
End…