gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:35:16 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com