傻大方提要:【C/C++编程笔记:C语言中的复杂声明分析,实例带你完全读懂】并从右向左读取。2)要将表达式转换为后缀,请从最里面的括号开始,如果不存在最里面的括号,则从声明名称开始,然后右移。第一次遇到结尾括号时,请向左走。解析完整个括号后...
按关键词阅读:
大多数时候 , 声明很容易阅读 , 但是很难读取一些涉及函数指针的声明 。
文章插图
例如 , 考虑“ signal.h”中的以下声明 。
void(*bsd_signal(int, void(*)(int)))(int);
让我们看看读取复杂声明的步骤:
1) 将C声明转换为后缀格式 , 并从右向左读取 。
2) 要将表达式转换为后缀 , 请从最里面的括号开始 , 如果不存在最里面的括号 , 则从声明名称开始 , 然后右移 。 第一次遇到结尾括号时 , 请向左走 。 解析完整个括号后 , 便会从括号中出来 。
3)继续直到解析完完整的声明 。
让我们从简单的例子开始 。
文章插图
1) int(*fp) ();
让我们将上面的表达式转换为后缀格式 。 对于上面的示例 , 没有最里面的括号 , 因此 , 我们将打印声明名称 , 即“ fp” 。 下一步是转到表达式的右侧 , 但是“ fp”的右侧没有要解析的内容 , 这就是为什么转到左侧 。 在左侧 , 我们找到了“ *” , 现在打印了“ *” , 并且没有括号 。 我们将获得如下的后缀表达式 。
fp *()int
现在从左到右读取后缀表达式 。 例如fp是指向返回int的函数的指针
让我们看看更多示例 。
2) int(*daytab)[13]
后缀:daytab * [13] int
含义:daytab是指向13个整数的数组的指针 。
3) void(*f[10]) (int, int)
后缀:f [10] *(int , int)void
含义:f是10个指向函数的指针的数组(该函数需要2个int类型的参数) , 返回void
文章插图
4) char(*(*x())[]) ()
后缀:x()* [] *()char
含义:x是一个返回指向指向返回char的指针的数组的函数
5) char(*(*x[3])())[5]
后缀:x [3] *()* [5] char
含义:x是3个指向函数的指针的数组 , 返回5个char的数组的指针
6) int*(*(*arr[5])()) ()
后缀:arr [5] *()*()* int
含义:arr是5个指向函数的指针的数组 , 返回指向函数的指针 , 返回指向整数的指针
7) void(*bsd_signal(intsig, void(*func)(int)))(int);
后缀:bsd_signal(int sig , void(* func)(int))*(int)void
含义:bsd_signal是一个使用整数和指向该函数的指针的函数(该函数以整数作为参数并返回void)并返回指向一个函数(以整数为参数并返回void)
希望对大家有帮助 , 以上为本期分享内容!
另外如果你想更好地提升你的编程能力 , 学好C语言C++编程!弯道超车 , 快人一步!
编程学习书籍分享:
文章插图
编程学习视频分享:
文章插图
分享(源码、项目实战视频、项目笔记 , 基础入门教程)
欢迎转行和学习编程的伙伴 , 利用更多的资料学习成长比自己琢磨更快哦!
【C/C++编程笔记:C语言中的复杂声明分析,实例带你完全读懂】C语言C++编程学习交流圈子 , 点击下方【了解更多】获取更多学习资料帮助你学习成长哦~
稿源:(未知)
【傻大方】网址:http://www.shadafang.com/c/111T313L2020.html
标题:C/C++编程笔记:C语言中的复杂声明分析,实例带你完全读懂