返回

文章详情

C ``顺时针/螺旋法则''

Hacker News2026年7月31日 13:56

[这篇文章是由其作者David Anderson于1994年5月6日发布在comp.lang.c上的。] 作者:David Anderson 有一种技术被称为``顺时针/螺旋法则'',它使任何C程序员能够在脑海中解析任何C声明!要遵循三个简单步骤:从未知元素开始,以螺旋/顺时针方向移动;遇到以下元素时,用相应的英文语句替换它们:[X]或[] => 数组X大小为... 或数组未定义大小为...(type1,type2) => 传递type1和type2的函数,返回... * => 指向...的指针。继续以螺旋/顺时针方向进行,直到所有标记都被覆盖。始终先解析括号中的内容! 示例#1:简单声明 +-------+ | +-+ | | ^ | | char *str[10]; ^ ^ | | | +---+ | +-----------+ 我们问自己:str是什么?``str是一个... 我们以顺时针方向移动,从`str'开始,我们看到的第一个字符是`[',所以,这意味着我们有一个数组,所以...``str是一个大小为10的数组... 继续以顺时针方向移动,接下来遇到的是`*',所以,这意味着我们有指针,所以...``str是一个大小为10的指向...的指针的数组。 继续以螺旋方向移动,我们看到行尾(`;'),所以继续前进,我们到达类型`char',所以...``str是一个大小为10的指向char的指针的数组。'' 我们现在已经``访问''了每个标记,因此我们完成了! 示例#2:指向函数的指针声明 +--------------------+ | +---+ | | |+-+| | | |^ || | char *(*fp)( int, float *); ^ ^ ^ || | | | +--+| | | +-----+ | +------------------------+ 我们问自己:fp是什么?``fp是一个... 以顺时针方向移动,首先看到的是`)';因此,fp在括号内,所以我们继续在括号内螺旋,看到下一个字符是`*',所以...``fp是一个指向...的指针。 现在我们已经出去了括号,继续以顺时针方向移动,我们看到`(';因此,我们有一个函数,所以...``fp是一个指向传递int和一个指向float的指针函数,返回... 继续以螺旋方式移动,我们看到`*',所以...``fp是一个指向传递int和一个指向float的指针函数,返回一个指向...的指针。 继续以螺旋方式移动,我们看到`;`,但我们还没有访问所有标记,因此我们继续,最终到达类型`char',所以...``fp是一个指向传递int和一个指向float的指针函数,返回一个指向char的指针。'' 示例#3:``终极'' +-----------------------------+ | +---+ | | +---+ |+-+| | | ^ | |^ || | void (*signal(int, void (*fp)(int)))(int); ^ ^ | ^ ^ || | | +------+ | +--+| | | +--------+ | +----------------------------------+ 我们问自己:`signal'是什么?注意到signal在括号内,所以我们必须先解决这个! 以顺时针方向移动,我们看到`(',所以我们有...``signal是一个传递int和...的函数。嗯,我们可以在`fp'上使用同样的规则,那么fp是什么?fp也在括号内,因此继续,我们看到`*',所以...fp是一个指向...的指针。 继续以顺时针方向移动,我们到达`(',所以...``fp是一个指向传递int返回...的函数。 现在我们继续离开函数的括号,我们看到void,所以...``fp是一个指向传递int不返回任何东西(void)的函数。'' 我们已经完成了fp,因此让我们赶上`signal',我们现在有...``signal是一个传递int和一个指向传递int不返回任何东西(void)的函数,返回... 我们仍然在括号内,因此下一个字符是`*',所以...``signal是一个传递int和一个指向传递int不返回任何东西(void)的函数,返回一个指向...的指针。 我们现在已经解决了括号内的项目,继续螺旋,看到另一个`(',所以...``signal是一个传递int和一个指向传递int不返回任何东西(void)的函数,返回一个指向传递int返回...的函数。 最后,我们继续,唯一剩下的就是单词`void',所以signal的最终完整定义是:``signal是一个传递int和一个指向传递int不返回任何东西(void)的函数,返回一个指向传递int不返回任何东西(void)的函数。'' 对于const和volatile也适用相同的规则。 例如:const char *chptr; 现在,chptr是什么?? ``chptr是一个指向char常量的指针。'' 那么这个:char * const chptr; 现在,chptr是什么?? ``chptr是一个指向char的常量指针。'' 最后:volatile char * const chptr; 现在,chptr是什么?? ``chptr是一个指向char的常量指针,volatile。'' 练习这个规则,参考K&R II第122页中的示例。版权©1993,1994 David Anderson 本文可自由传播,只要保留作者的名字和本声明。

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡