在K&R中,作者承认“C语言声明的语法有时会带来严重的问题”。C语言声明的语法对于编译器来说并不是什么大不了的事,但对于一般的程序员,它却会成为障碍。

在阅读较为复杂的代码时,首先让人感觉难以下手的就是声明了,有时候一大段声明摆在眼前完全不知道该如何读,看完都分不清返回值究竟是什么,通过阅读《C专家编程》的第三章,基本上可以解决以后见到的所有声明,这是我认为在这本书中重要程度排前列的章节,所以特此总结一下关于声明的读法。

首先,声明是由什么构成的,这里借用了《C专家编程》第三章”分析C语言的声明“这一节的一些内容

C语言声明的优先级规则:

A   声明从他的名字开始读取,然后按照优先级顺序依次读取

B    优先级从高到低依次是:

1、声明中被括号括起来的部分

2、后缀操作符:

括号()表示这是一个函数

方括号[]表示这是一个数组

3、前缀操作符:星号*表示“指向…的指针”

   如果const和(或)volatile关键字后面紧跟类型说明符(如int,long等),那么它作用于类型说明符。在其他情况下,关键字作用于它左边紧邻的指针星号。

例子:char *const *(*next)();

分析:A 首先看变量名,注意到被括号括住

B 所以把括号里的内容作为一个整体,得出“next是一个指向…的指针”

然后考虑括号外面的东西,有优先级B2的法则可知,右边的优先级更高,后面           是“()”所以可知“next是一个函数指针,指向一个返回…的函数”

然后,处理前缀”*”,得出指针所指的内容

C  最后把“char * const”解释为指向字符的常量指针

所以这个声明表示为“next是一个函数指针,它指向一个函数,该函数返回一个指针,该指针指向一个类型为char的常量指针”

以上的优先级规则就基本已经概括了所有的规则,下面是本书中的一个更加直观的声明解析步骤图

注意:在具体的每一个步骤上,我们首先查看右边的符号,然后再看左边的。

最后再来一个例子:char*(*c[10])(int **p);

分析:A  先看变量名,注意到被括号括住

B  所以把括号里的当做一个整体,得出”c是一个指向…的指针数组”

根据优先级规则,我们接下来看括号的右边,右边被括号括住,说明”c指针数           组中的指针指向一个函数”,注意此处关于函数参数的内容是可以拿出来独立

分 析的,所我们把它留在最后,不让他打乱我们的流程

然后,前缀“*”表示指向…的指针

最后char是用来修饰那个指针的,所以函数的返回值为一个指向char类型的指针

所以这个声明解释为“c是一个指针数组[0…9],它的元素类型是函数指针,其指向的函数的返回值是一个指向char的指针”

最后不要忘了括号中关于函数参数的内容:在数组中被函数指针所指向的所有函数都把一个指向指针的指针(二重指针)作为它的唯一参数。

OK 这下就大功告成了,如果可以顺利的分析出这种复杂程度的声明,在以后应该在分析声明时不会遇到什么难题了,毕竟,如果有谁在写项目时用比这还要复杂的声明,可能会被问候祖宗十八辈吧。

C语言声明的分析还是十分重要的部分,这部分的东西要读多次,直到完全理解并且掌握了声明的阅读流程。

如何理解C语言的声明相关推荐

  1. 理解C语言中指针的声明以及复杂声明的语法

    昨天刚把<C程序设计语言>中"指针与数组"章节读完,终于把心中的疑惑彻底解开了.现在记录下我对指针声明的理解,顺便说下如何在C语言中创建复杂声明以及读懂复杂声明. 本文 ...

  2. 【C语言】函数的理解——关于函数的声明

    函数的理解--关于函数的声明 #include <stdio.h> //void sumx(int begin,int end);//函数的声明 void sumx(int ,int ) ...

  3. java语言中声明布尔型_【Java初探02】——Java语言基础

    本篇博文就Java语言的一些基本元素进行一些记录和阐述,主要讲解一下Java语言的一些基本构成元素和Java的主类结构. Java语言基础的大致组成 java主类结构 基本的数据类型 变量与常量 运算 ...

  4. 《C专家编程》第三章——分析C语言的声明

    前面一章我们已经说过C语言存在的一些问题和它晦涩的地方,让我们对这门神奇的语言有了更深的了解.现在这一章则集中精力来讨论C语言的声明,分为三块,首先是说明C语言声明晦涩难懂的原因和声明是如何形成的,其 ...

  5. C语言变量声明和定义 - C语言零基础入门教程

    目录 1.变量名的开头必须是字母或下划线,不能是数字 2.变量名中的字母是区分大小写的 3.变量名绝对不可以是 C 语言关键字 4.变量名中不能有空格 四.猜你喜欢 零基础 C/C++ 学习路线推荐 ...

  6. 水滴石穿C语言之声明的语法

    概述 在很多情况下,尤其是读别人所写代码的时候,对C语言声明的理解能力变得非常重要,而C语言本身的凝练简约也使得C语言的声明常常会令人感到非常困惑,因此,在这里我用一篇的内容来集中阐述一下这个问题. ...

  7. 理解C语言——从小菜到大神的晋级之路(9)——多维数组

    本节视频链接:点击这里 1.多维数组的定义和结构         一个数组中可以支持各种数据类型,那么一个数组中的每一个元素同样也可以是一个数组.对于上次提到的一维数组,其每个元素都是一个简单数据类型 ...

  8. C语言文件联系人管理碎片整理,深入理解C语言内存管理.docx

    深入理解C语言内存管理 之前在学Java的时候对于Java虚拟机中的内存分布有一定的了解,但是最近在看一些C,发现居然自己对于C语言的内存分配了解的太少. 问题不能拖,我这就来学习一下吧,争取一次搞定 ...

  9. 理解GO语言make 和 new 的区别

    new 和 make 都可以用来分配空间,初始化类型,但是它们确有不同. 函数原型 new 是内建函数,函数原型为: func new(Type) *Type make 也是内建函数,它的函数原型 比 ...

最新文章

  1. 安卓Activity界面切换添加动画特效
  2. 搭建K8s集群(kubeadm方式)-部署node节点和集群测试
  3. CodeForces - 1215C Swap Letters(暴力+思维+模拟)
  4. sklearn自学指南(part3)--使用手册的目录
  5. 用十条命令在一分钟内检查Linux服务器性能
  6. JAX-RS 2.0:服务器端处理管道
  7. 009-MailUtils工具类模板
  8. 数据库实验四 用户权限管理
  9. Oracle表空间大小的限制和DB_BLOCK_SIZE的概念
  10. np完全问题的例子_MIT开发光子算法,试图解决世界7大数学难题的“NP完全问题”...
  11. Python3初级知识整理
  12. 会说话的PPT,从开发者角度十分钟理解区块链
  13. 二维离散傅里叶变换 matlab
  14. client-go实战之三:Clientset
  15. [loj6388] 「THUPC2018」赛艇 / Citing
  16. SocialBoo出海指南 || 海外网红营销深度报告
  17. Matlab机器人的仿真(八):绘制机器人运动轨迹(复现)
  18. 计算机方向kade期刊,计算机辅助导航技术在上颌骨肿瘤切除及缺损重建中的应用...
  19. Win10已安装更新无法卸载怎么办?
  20. 熬夜加班问题总结反思

热门文章

  1. On Premises+Cloud:平滑实现IT应用云转型
  2. Microsoft Dynamics 365 (on-premises) Update 2.12
  3. linux中出现不在 sudoers 文件中。此事将被报告的解决方法
  4. 【建议收藏】2020年中高级Android大厂面试秘籍,为你保驾护航金三银四,直通大厂(Android高级篇上)...
  5. Amazon S3文件存储的上传下载如何测试
  6. 下列符号中 表示python中单行注释的是_下列符号中,表示Python中单行注释的是...
  7. JAVA个人记账本代码,Java的家庭记账本程序(L)
  8. 个人隐私保护条例_个人信息保护及隐私政策
  9. 创新战略|工业企业如何应对颠覆式变革带来的挑战?
  10. CUBA China 最新进展