C语言的“顺时针/螺旋规则”
摘要
一种通过遵循顺时针/螺旋规则解析复杂C声明的经典技术,并附有实例。
暂无内容
查看缓存全文
缓存时间: 2026/07/31 17:01
# 顺时针/螺旋规则
来源:https://c-faq.com/decl/spiral.anderson.html
[本文由作者 David Anderson 于 1994-05-06 发布到 comp.lang.c。]
## 作者:David Anderson
有一种被称为“顺时针/螺旋规则”的技巧,它能让任何 C 程序员在脑海中解析任何 C 声明!
只需遵循三个简单的步骤:
1. 从未知元素开始,沿螺旋/顺时针方向移动;当遇到以下元素时,用对应的英文语句替换它们:
[X] 或 [] => 大小为 X 的数组... 或 未定义大小的数组...
(type1, type2) => 接收 type1 和 type2 参数并返回... 的函数
* => 指向... 的指针
2. 继续沿螺旋/顺时针方向进行,直到覆盖所有记号。
3. 始终优先解析括号内的内容!
### 示例 #1:简单声明
``
+-------+
| +-+ |
| ^ | |
char *str[10];
^ ^ | |
| +---+ |
+-----------+
``
我们问自己:str 是什么?
> `str 是一个.....`
>
> - 我们从 `str` 开始,沿螺旋顺时针方向移动,看到的第一个字符是 `[`,所以这意味着我们有一个数组,所以.....
> `str 是一个大小为 10 的数组.....`
> - 继续沿螺旋顺时针方向移动,接下来遇到的是 `*`,所以这意味着我们有指针,所以.....
> `str 是一个大小为 10 的指向.....的指针数组`
> - 继续沿螺旋方向移动,我们看到行尾(`;`),所以继续前进,到达类型 `char`,所以.....
> `str 是一个大小为 10 的指向 char 的指针数组`
> - 我们现在已经“访问”了每一个记号;因此完成了!
### 示例 #2:指向函数的指针声明
``
+--------------------+
| +---+ |
| |+-
相似文章
旋转算法再探:clang的libcxx中的循环分解
本文深入探讨了clang的libcxx中用于旋转操作的循环分解算法,解释了该算法如何通过计算最大公约数(gcd)来确定循环数量,从而实现最少的交换次数。
用C语言搞怪,第&((int*)-8)[3]部分
一篇幽默的教育性文章,涵盖C语言基础知识,如前向声明、运算符优先级、无条件跳转和基本算术运算,并附带有意搞怪的代码示例。
解析C语言中类型推断声明之险
这篇博文探讨了C23中涉及`auto`作为类型推断说明符或存储类说明符的解析歧义,展示了当`x`是typedef时,GCC和Clang在解析如`auto x = 67;`这样的声明上的分歧,以及属性如何使情况复杂化。
C程序员再犯可读性罪行
2025年国际混淆C代码大赛获奖者揭晓,共有23个参赛作品,其中包括Adrian Cable的Subleq计算机模拟器,该模拟器通过单指令集架构实现软件保存。
用于C语言的单头文件解析器组合子
CParseC 是一个基于 C99 的单头文件解析器组合子库,灵感来自 Haskell 的 Parsec,提供零拷贝解析、无隐藏内存分配以及 SIMD 优化的组合子。其目标是提供一种灵活、高性能的手写解析器和 lex/yacc 工具的替代方案。