我今天刚看到一张照片,我想我会很感激解释。所以这是图片:
我发现这令人困惑,想知道这样的代码是否实用。我用谷歌搜索了这张图片,在这个reddit 条目中找到了另一张图片,这是这张图片:
那么这种“螺旋式阅读”是有效的吗?这是 C 编译器的解析方式吗? 如果对这个奇怪的代码有更简单的解释,那就太好了。 除此之外,这些代码有用吗?如果是这样,何时何地?
有一个关于“螺旋规则”的问题,但我不只是询问它是如何应用的,或者如何使用该规则读取表达式。我也在质疑这种表达方式的用法和螺旋规则的有效性。关于这些,已经发布了一些不错的答案。
有一条称为“顺时针/螺旋规则”的规则可以帮助找到复杂声明的含义。
来自c-faq:
需要遵循三个简单的步骤: 从未知元素开始,沿螺旋/顺时针方向移动;当遇到以下元素时,用相应的英文语句替换它们: [X]或[] => 数组 X 大小…或数组未定义大小… (type1, type2) => 函数传递 type1 和 type2 返回… * => 指向…的指针 继续以螺旋/顺时针方向执行此操作,直到所有标记都被覆盖。 始终首先解决括号中的任何内容!
需要遵循三个简单的步骤:
[X]或[] => 数组 X 大小…或数组未定义大小…
[X]
[]
(type1, type2) => 函数传递 type1 和 type2 返回…
(type1, type2)
* => 指向…的指针
*
继续以螺旋/顺时针方向执行此操作,直到所有标记都被覆盖。
始终首先解决括号中的任何内容!
您可以查看上面的链接以获取示例。
另请注意,为了帮助您,还有一个名为:
http://www.cdecl.org
你可以输入一个 C 声明,它会给出它的英文含义。为了
void (*(*f[])())()
它输出:
将 f 声明为指向函数的指针数组,返回指向函数的指针,返回 void
编辑:
正如的评论所指出的那样,螺旋规则不解决数组的数组,并且会导致(大多数)这些声明中的错误结果。例如对于螺旋规则忽略了具有更高优先级int **x[1][2];的事实。[]``*
int **x[1][2];
[]``*
在数组数组前面时,可以先添加显式括号,然后再应用螺旋规则。例如:由于优先级与(也是有效int **x[1][2];的 C)相同,int **(x[1][2]);然后螺旋规则正确地将其读取为“x 是指向 int 的指针的数组 2 的数组 1”,这是正确的英文声明。
int **(x[1][2]);