c - 关于声明的螺旋法则——什么时候出错了?

标签 c declaration

我最近学习了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/

相关文章:

c - 在 Visual C++ 中使用 char 表示固定字符串

c++ - 在 C++ 中,函数声明中分号前的宏用法

CMSIS FIR 带通滤波器

c - 生成没有良好随机源的初始化 vector

c - 按字典顺序返回内存字符对用户输入进行排序?

c - 为什么这段代码不能识别任何 if 语句?

main 之后的 c++ 类声明?

c++ - do-while 语句主体中的声明范围

objective-c - 在@interface、扩展中声明方法或根本不声明的指南

c++ - 是否可以在 C++ 中的 2 个或更多文件中定义一个类?