Spiral/Clockwise Method 是 C/C++ 程序员在几秒钟内在头脑中定义语法声明含义的神奇工具。此方法由David Anderson创建,这里简要介绍如何应用此方法。
在编码时,当有人遇到新的不需要的语法声明时:
string(const** f(int, void (*const p)(int)))(char[]);
这里出现的问题是函数名“f”的含义是什么?有一种臭名昭著的方法可以帮助人们在几秒钟内推断出这个函数“f”的含义。
方法:
第 1 步:考虑这个顺时针螺旋。
第 2 步:将O替换为。
Step3:现在,沿着顺时针方向,替换“|”用一些词尝试理解语法的含义,并替换“|”用“(”。圆括号解释了它的函数并说 “’a’ 是一个函数”。
第 4 步:考虑查看圆括号/函数内部的内容,因此遇到开括号(记住,从运算符的优先级开始,括号总是先开)并从左到右直到圆括号“)”的末尾.它可以说是“‘a’是与整数的‘x’作为自变量的函数”。
第五步:现在回到第一个圆括号,继续从“(”开始的螺旋路径。用“*”替换“|”。这意味着一个返回值和指针。这里“’a’是一个带有整数的函数’ x’ 作为参数返回指向“.
第六步:继续顺时针旋转。一个人会遇到已经处理过的“int”,所以继续螺旋路径。
第七步:替换“|”与“int”。它可以说是“‘a’是与整数的‘x’作为返回一个指针的整数自变量的函数”。
第 8 步:再次,继续这条路径,会得到“;”这意味着这是语句的结尾,看看这就是如何轻松定义语法的含义。
最后,可以说是“‘a’是一个整数的‘x’作为返回一个指向整数自变量的函数”。
答案: f 是一个参数为 int 的函数和一个参数为 int 的 pa函数,返回一个指向空的常量指针 (void) 返回一个指向常量函数的指针,以字符数组作为参数返回一个字符串。
要点:
- 语法说明:
- A[ ]:数组 A 的大小未定义,A[ 5 ] 表示数组的大小为 5。
- (type 1,type 2):函数传递type1和type2。
- *:指向。
- 从变量名开始。
- 保持这个读数直到变量声明中的所有修饰符都被覆盖。
- 始终先完成括号中的任何内容。
- 继续以螺旋/顺时针方向执行此操作,直到覆盖所有标记。
例子:
通过想象大脑中的螺旋来考虑一个例子:
char const *p ( int , const (int *)*);
记住拇指法则。始终以变量的名称开头。从变量 p 顺时针螺旋开始。
第 1 步: ‘p’ 是变量。
p
第 2 步: ‘p’ 是一个指向的变量。
p -> *
第 3 步: ‘p’ 是一个变量,它是一个指向函数的指针。
p -> * -> (
第 4 步: ‘ p’ 是一个变量,它是一个指向以 int 作为参数的函数的指针。
p -> * -> ( -> int
第五步:下一步,没有变量名,所以给一个。让它成为’a’。所以表达式可以写成:
char const *p ( int , const (int *)* a );
第 6 步:这里的 ‘a’ 是一个变量。
a
第 7 步:封闭的圆括号什么也没说,所以继续。
a-> )
步骤8:在下一步中,a 是指向的变量指针。
a -> ) -> *
第9步:忽略分号,因为语法定义不完整,所以继续。
a -> ) -> * -> ;
第 10 步:封闭的圆括号什么也没说,所以继续。
a -> ) -> * -> ; -> )
第 11 步:现在 ‘a’ 是一个指向指针的变量指针。
a -> ) -> * -> ; -> ) -> *
第 12 步: ‘a’ 是指向 int 指针的变量指针。
a -> ) -> * -> ; -> ) -> * -> int
第 13 步: ‘a’ 是指向 int 常量的变量指针。
a -> ) -> * -> ; -> ) -> * -> int -> const
让我们回到定义“p”的地方。
第 14 步: ‘p’ 是一个变量,它是一个指向以 int 为参数的函数的指针和一个指向返回常量的指针 int 常量的变量指针。
p -> * -> ( -> int , const... -> const
笔记:
已经用于定义语法的重用术语在此处被忽略。
第 15 步: p 是一个变量,它是一个指向以 int 为参数的函数的指针和一个指向 int 常量的变量指针,该指针返回一个常量字符。
p -> * -> ( -> int , const... -> const->char
这完成了语法的完整含义。
笔记:
当语法包含数组(尤其是多维数组)时,此规则有一个例外,因此此规则有更新。
- 当遇到数组时,移动到最右边的右方括号并将数组视为一次“扫描”
- 例子:
- int *a[10][]: ‘a’ 是一个大小为 10 的多维数组和一个未定义大小的指向 int 的指针。