我最近学习了the spiral rule为了去混淆复杂的声明,应该用一系列的 typedef 来编写。但是,以下评论让我感到震惊:
A frequently cited simplification, which only works for a few simple cases.
我没有找到 void (*signal(int, void (*fp)(int)))(int);
一个“简单的案例”。顺便说一句,这更令人担忧。
所以,我的问题是,在哪些情况下应用该规则是正确的,在哪些情况下是错误的?
最佳答案
基本上来说,这个规则根本行不通,否则它 通过重新定义螺旋的含义来工作(在这种情况下, 这没有意义。考虑一下,例如:
int* a[10][15];
螺旋法则给出的是一个指针数组[10]
array[15] of int,这是错误的。在你引用的情况下,它
也不起作用;事实上,在 signal
的情况下,它不是
甚至清楚你应该从哪里开始螺旋。
一般来说,更容易找到规则失败的例子 比它起作用的例子。
我经常想说解析 C++ 声明是 简单,但没有人尝试过复杂的声明 会相信我。另一方面,它并不像现在那么难 有时被证明是。秘诀是想一想 声明与表达式完全一样,但有很多 更少的运算符,以及一个非常简单的优先规则:所有运算符 右边的运算符优先于左边的所有运算符。在 没有括号,这意味着处理一切到 首先是右边,然后是左边的所有东西,然后处理 括号与在任何其他表达式中完全一样。这 实际的困难不是语法本身,而是它 结果是一些非常复杂和违反直觉的声明, 特别是函数返回值和指向的指针 涉及的功能:先右后左规则的意思 特定级别的运算符(operator)通常相隔很远, 例如:
int (*f( /* lots of parameters */ ))[10];
这里展开式的最后一项是 int[10]
,但是把
[10]
在完整的函数规范之后是(在
至少对我来说)非常不自然,我必须停下来解决问题
每一次。 (这可能是逻辑上相邻的这种趋势
散布的部分导致螺旋规则。问题
当然,在没有括号的情况下,他们不会
总是展开——任何时候你看到[i][j]
,规则就是
对,然后再向右走,而不是盘旋。)
因为我们现在考虑声明
表达式:当表达式变得太过时你会怎么做
读起来复杂吗?您按顺序引入中间变量
使其更易于阅读。在声明的情况下,
“中间变量”是 typedef
。特别是,我会
认为返回类型的任何时间部分都在
函数参数(以及很多其他时间),你
应该使用 typedef
来简化声明。 (这个
然而,这是一条“按我说的做,而不是按我做的”规则。恐怕
我偶尔会使用一些非常复杂的声明。)
关于c - 关于声明的螺旋法则——什么时候出错了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16260417/