[本文由作者 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 是一个…

示例 #2:指向函数的指针声明

                     +--------------------+
                     | +---+              |
                     | |+-+|              |
                     | |^ ||              |
                char *(*fp)( int, float *);
                 ^   ^ ^  ||              |
                 |   | +--+|              |
                 |   +-----+              |
                 +------------------------+
我们要问自己的问题:fp 是什么?
“fp 是一个…

示例 #3:“终极”

                      +-----------------------------+
                      |                  +---+      |
                      |  +---+           |+-+|      |
                      |  ^   |           |^ ||      |
                void (*signal(int, void (*fp)(int)))(int);
                 ^    ^      |      ^    ^  ||      |
                 |    +------+      |    +--+|      |
                 |                  +--------+      |
                 +----------------------------------+

我们要问自己的问题:'signal' 是什么?

请注意,signal 括号内,所以我们必须首先解析它!

对于 const 和 volatile 也应用相同的规则。例如:

	const char *chptr;

这个怎么样

	char * const chptr;

最后

	volatile char * const chptr;

请使用 K&R II 第 122 页上的示例来练习此规则。


版权所有 © 1993,1994 David Anderson

本文可以自由分发,但必须保留作者姓名和本声明。