`
lc52520
  • 浏览: 371431 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

复杂C声明【转载】

阅读更多
复杂的C声明一般被认为不是很好的编程习惯,当然也就不推荐使用。但是在读很多前辈遗留的代码时,又不得不面对这一问题。知道总比不知道好,我们还是来看看分析复杂C语言声明的规则吧,用例子分析最直观。

一、“right-left”规则
看过《C专家编程》中的分析规则,用起来并不是很舒服,遂在网上寻找,发现还有一个著名的“right-left”规则。规则经翻译总结后如下:

“right-left”规则:
0. 规则中符号
*  读作 “指向...的指针” 
[]   读作 “...的数组” 
()  读作 “返回...的函数”
1. 起始点
找到声明中的标识符(Identifier),它就是你分析的起始点,读作:“$(Identifier)是...”;

2. 右边
看你的标识符右边
a) 如果发现“()”,你将知道这是一个函数声明,这时你可以说“$(Identifier)是返回...的函数”;
b) 如果发现“[]”,你将知道这是一个数组声明,这时你可以说“$(Identifier)是...的数组”;
c) 继续向右,直到遇到右边声明结束或者遇到“)”,继续下面。
3. 左边
看你的标识符左边
a) 如果碰到的不是我们在0.中定义的符号,则直接说出它;否则按照0.中定义的符号含义说出。继续向左,直到遇到左边声明结束或“(”。
4. 重复2和3的步骤,直到声明分析完毕。

二、例子详解
我们从简单到复杂,循序渐进。
[Example 1] int *p[];
1) 找到标识符:p,读作:“p是...”;
2) 向右看:发现一“[]”,然后遇到右边声明结尾,读作:“p是...的数组”;
3) 向左看:发现一“*”, 读作:“p是指向...的指针的数组”;
4) 继续向左看:没有发现0.中定义的符号,则分析结束,读作:“p是指向int类型的指针的数组”。

[Example 2] int *(*func())();
1) 找到标识符:func,读作:“func是...”;
2) 向右看:发现一“()”,然后遇到“)”,读作:“func是返回...的函数”;
3) 向左看:发现一“*”,然后遇到“(”,读作:“func是返回指向...的指针的函数”;
4) 向右看:发现一“()”,然后右边声明结束,读作:“func是返回指向返回...的函数的指针的函数”;
5) 向左看:发现一“*”,读作:“func是返回指向返回指向...的指针的函数的指针的函数”;
6) 向左看:没有发现.中定义的符号,则分析结束,读作:“func是返回指向返回指向int类型的指针的函数的指针的函数”。

三、常见不合法的声明符号组合
包括:
[]() - cannot have an array of functions
()() - cannot have a function that returns a function
()[] - cannot have a function that returns an array
分享到:
评论

相关推荐

    转载]如何理解c和c ++的复杂类型声明

    【理解C和C++的复杂类型声明】 在C和C++编程中,有时会遇到复杂的类型声明,这可能会让初学者感到困惑。本文旨在帮助理解这些复杂的声明,并提供解析它们的技巧。首先,我们从简单的类型声明开始。 1. 简单类型...

    C的一些整理(转载free)

    本文将深入探讨“C的一些整理”,重点围绕堆和栈的区别以及C语言中指针的奥秘和复杂应用展开。 首先,我们要了解的是堆和栈这两种内存区域的不同。栈内存,也称为自动存储区,主要用于存放程序运行过程中的局部变量...

    Object-C 经典入门教程

    Object-C是一种面向对象的编程语言,它衍生自C语言,因此继承了C语言的许多特性,并在此基础上增加了一些面向对象的功能。Object-C是苹果公司开发软件的主要语言之一,广泛应用于iOS和Mac OS平台的应用程序开发中。 ...

    Objective-C 入门手册 中文版(Objective-C Beginner's Guide)

    - **@interface**:定义类的接口,声明类的属性和方法。 - **@implementation**:实现类的接口,提供方法的具体实现。 - **多重参数**:方法可以接受多个参数,用于传递不同类型的数据。 - **建构子...

    单片机以太网上网原代码(keil 工程,用RTS8019)--转载

    1)精简TCP/IP 协议栈,以减小代码量。ZLIP 目前没有支持UDP 协议,ICMP 协议 也只支持其中的echo 协议(响应ping 数据包)。...明确存储类型的指针,需要重入的函数已经声明为reentant,使用KeilC 的小 模式下编译。

    指针 突破 (转载他人,是指针解说的精华)

    1. **指针的类型**:指针的类型是指针变量自身的类型,决定于声明时的修饰符。例如: - `int*ptr;` 的指针类型为 `int*`。 - `char*ptr;` 的指针类型为 `char*`。 - `int**ptr;` 的指针类型为 `int**`。 - `int...

    Keil编程环境下STM32内存管理研究[转载]

    如“variable 'c' was set but never used”表明变量c被赋值,但未被使用。而“variable 'x' was declared but never referenced”则表示变量x被声明了,但是从未被引用过。这些信息有助于开发者优化代码,提高资源...

    Eclipse快捷键大全(转载)

    如果你有一段复杂的表达式,并希望将其替换为一个有意义的变量名,这个快捷键非常适合。 **Alt+Shift+F:** 将局部变量转换为字段变量。这对于将临时变量转换为类的成员变量非常有用。 **Alt+Shift+I:** 内联变量...

    转载 仿百度能力开放平台的spring cloud 微服务框架 ,-open-capacity-platform.zip

    10. **持续集成/持续部署(CI/CD)**:Jenkins、GitLab CI/CD等工具与Spring Cloud的配合,可以自动化构建、测试和部署微服务,加速开发流程。 总的来说,这个开源项目可能是为了提供一个类似于百度能力开放平台的...

    c99 学习笔记

    为了充分利用C语言的功能,开发者需深入理解C99标准所引入的诸多新特性,例如对变量的声明位置、复合字面量、可变长度数组(VLA)以及对预处理器的增强等。 从描述“屌炸天的 C 语言学习笔记,原生态手写,版权归属...

    Lua中文教程

    - **可扩展性**:Lua可以通过C/C++进行扩展,这意味着用户可以根据需要添加复杂的功能而不牺牲性能。 - **跨平台性**:由于Lua是基于ANSI C编写的,因此它可以在几乎所有支持C编译器的操作系统上运行,包括Windows、...

    Writing Compilers and Interpreters 3rd Edition

    本书由Ronald Mak撰写,第三版由Wiley Publishing, Inc.出版。书中不仅涵盖了传统编译技术的基础知识,还包括了现代软件工程方法在编译器和解释器构建过程中的应用。 ### 编译器与解释器的基本概念 编译器...

    2天驾驭div+css(全新发布2.0版本)

    本书的版权声明部分明确指出,教材内容受版权保护,禁止未经允许的商业用途使用、复制、转载、摘编、修改等行为。非盈利性个人或组织可以自由传播本教程内容,但必须明确标明来源及作者信息,不能断章取义,也不能在...

    programming in lua 中文版(非扫描)

    正如武术高手能够运用看似简单的招式击败强敌一样,优秀的程序员也能够利用看似简单的编程语言创造出复杂而强大的系统。这表明编程语言的选择并非决定项目成败的关键因素,更重要的是程序员的技术水平和个人修养。 ...

    lua 学习教程

    - **版权声明**:本书翻译自《Programming in Lua》,由www.luachina.net翻译完成,仅供个人使用,禁止任何形式的转载或发布,否则需承担相应责任。 - **版权信息**:版权所有 ©2003-2004 Roberto Ierusalimschy。...

    Paralle Programming for Multicore and Cluster Systems

    而该书的版权信息和法律声明部分,则强调了出版社对内容的版权保护,并阐明了复制、转载和使用书中的材料所应遵循的法律规定。 在并行计算领域,多核处理器和集群系统是当前高性能计算(HPC)的基石。多核处理器...

Global site tag (gtag.js) - Google Analytics