我今天刚看到一张照片,希望得到解释。所以这是图片:
抄写:“C 并不那么难:void (*(*f[])())()
定义f
作为未指定大小的数组,包含指向函数的指针,该函数返回指向返回的函数的指针void
."
我发现这令人困惑,并想知道这样的代码是否实用。我用谷歌搜索了这张照片,发现了另一张照片this https://www.reddit.com/r/ProgrammerHumor/comments/3yfpub/c_isnt_that_hard/cyd5f8dreddit 条目,这是该图片:
抄写:“所以这些符号可以读作:f [] * () * () void
. f
是一个指针数组,不带参数并返回一个不带参数并返回的指针void
".
那么这种“螺旋式阅读”是有效的吗? C编译器是这样解析的吗?
如果对这个奇怪的代码有更简单的解释那就太好了。
抛开这些,这样的代码能有用吗?如果是的话,地点和时间?
有一个问题 https://stackoverflow.com/questions/3707096/spiral-rule-and-declaration-follows-usage-for-parsing-c-and-c-declarations关于“螺旋规则”,但我不仅仅是问它如何应用或如何用该规则读取表达式。我也质疑此类表达式的使用和螺旋规则的有效性。关于这些,已经发布了一些很好的答案。
有一条规则叫做“顺时针/螺旋规则” http://c-faq.com/decl/spiral.anderson.html帮助找到复杂声明的含义。
From c-faq http://c-faq.com/decl/spiral.anderson.html:
需要遵循三个简单的步骤:
-
从未知元素开始,沿螺旋/顺时针方向移动;遇到以下内容时用相应的英文语句替换:
[X]
or []
=> 数组 X 大小...或数组未定义大小...
(type1, type2)
=> 函数传递 type1 和 type2 返回...
*
=> 指向...的指针
继续以螺旋/顺时针方向执行此操作,直到覆盖所有标记。
始终首先解决括号中的任何问题!
您可以查看上面的链接以获取示例。
另请注意,为了帮助您,还有一个名为:
http://www.cdecl.org http://www.cdecl.org
你可以输入一个C声明,它会给出它的英文含义。为了
void (*(*f[])())()
它输出:
将 f 声明为指向函数的指针数组,返回指向返回 void 的函数的指针
EDIT:
正如评论中指出的随机832 https://stackoverflow.com/users/691884/random832,螺旋规则不处理数组数组,并且会导致(大多数)这些声明中出现错误结果。例如对于int **x[1][2];
螺旋法则忽略了这样一个事实[]
优先于*
.
当在数组数组前面时,可以在应用螺旋规则之前先添加显式括号。例如:int **x[1][2];
是相同的int **(x[1][2]);
(也是有效的 C)由于优先级和螺旋规则,然后将其正确读取为“x 是指向 int 的指针的数组 2 的数组 1”,这是正确的英语声明。
请注意,这个问题也已在本文中讨论过answer https://stackoverflow.com/questions/16260417/the-spiral-rule-about-declarations-when-is-it-in-error/16265389#16265389 by 詹姆斯·坎泽 https://stackoverflow.com/users/649665/james-kanze(指出由haccks https://stackoverflow.com/users/2455888/haccks在评论中)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)