小编典典

C 并不难: void ( *( *f[] ) () ) ()

all

我今天刚看到一张照片,我想我会很感激解释。所以这是图片:

一些c代码

我发现这令人困惑,想知道这样的代码是否实用。我用谷歌搜索了这张图片,在这个reddit
条目中找到了另一张图片,这是这张图片:

一些有趣的解释

那么这种“螺旋式阅读”是有效的吗?这是 C 编译器的解析方式吗?
如果对这个奇怪的代码有更简单的解释,那就太好了。
除此之外,这些代码有用吗?如果是这样,何时何地?

有一个关于“螺旋规则”的问题,但我不只是询问它是如何应用的,或者如何使用该规则读取表达式。我也在质疑这种表达方式的用法和螺旋规则的有效性。关于这些,已经发布了一些不错的答案。


阅读 74

收藏
2022-07-12

共1个答案

小编典典

有一条称为“顺时针/螺旋规则”的规则可以帮助找到复杂声明的含义。

来自c-faq

需要遵循三个简单的步骤:

  1. 从未知元素开始,沿螺旋/顺时针方向移动;当遇到以下元素时,用相应的英文语句替换它们:

[X][]
=> 数组 X 大小…或数组未定义大小…

(type1, type2)
=> 函数传递 type1 和 type2 返回…

*
=> 指向…的指针

  1. 继续以螺旋/顺时针方向执行此操作,直到所有标记都被覆盖。

  2. 始终首先解决括号中的任何内容!

您可以查看上面的链接以获取示例。

另请注意,为了帮助您,还有一个名为:

http://www.cdecl.org

你可以输入一个 C 声明,它会给出它的英文含义。为了

void (*(*f[])())()

它输出:

将 f 声明为指向函数的指针数组,返回指向函数的指针,返回 void

编辑:

正如的评论所指出的那样,螺旋规则不解决数组的数组,并且会导致(大多数)这些声明中的错误结果。例如对于螺旋规则忽略了具有更高优先级int **x[1][2];的事实。[]``*

在数组数组前面时,可以先添加显式括号,然后再应用螺旋规则。例如:由于优先级与(也是有效int **x[1][2];的 C)相同,int **(x[1][2]);然后螺旋规则正确地将其读取为“x 是指向 int 的指针的数组 2 的数组 1”,这是正确的英文声明。

2022-07-12