如何搜索asp网站,wordpress多线程,wordpress主题大前端dux去授权,wordpress 标签 图片 alt如何读懂 C 语言复杂的声明 作者能力有限, 如果您在阅读过程中发现任何错误, 还请您务必联系本人,指出错误, 避免后来读者再学习错误的知识.谢谢! 参考C专家编程 废话
虽说 C 语言相比于其他更高级的语言来讲#xff0c;有着非常精简的语法结构#xff0c;对… 如何读懂 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…