后缀/前缀运算符优先级和结合性

2024-01-10

我很困惑优先级 and 关联性后缀/前缀运算符。

一方面,当我正在阅读 K&R 的书时,它指出:

(*ip)++

在最后一个示例中,括号是必需的;如果没有它们,表达式将增加 ip 而不是它所指向的值,因为像 * 和 ++ 这样的一元运算符从右到左关联。

没有提及后缀/前缀运算符之间结合性的差异。两者都受到平等对待。书中还指出*和++具有相同的优先级。

另一方面,这一页 https://www.geeksforgeeks.org/difference-between-p-p-and-p/指出:

1) 前缀++和*的优先级相同。两者的结合性都是从右到左。

2)后缀++的优先级高于*和前缀++。 postfix ++ 的结合性是从左到右。

我应该相信哪一个?多年来 C 版本的修订是否有所改变?


TL;DR:这两个描述说的是同一件事,使用相同的词语和符号,但含义略有不同。

一方面,当我正在阅读 K&R 的书时,它指出:

(*ip)++

在最后一个示例中,括号是必需的;如果没有它们,表达式将增加 ip 而不是它指向的值, 因为像 * 和 ++ 这样的一元运算符从右到左关联。

没有提及之间的关联性差异 后缀/前缀运算符。两者都受到平等对待。本书还 说明 * 和 ++ 具有相同的优先级。

目前尚不清楚您正在阅读哪个版本的 K&R,但至少第一版确实将递增和递减运算符的前缀和后缀版本分别视为单个运算符,其效果取决于它们的操作数是在它们之前还是之后。

另一方面,该页面指出:

1) 前缀++和*的优先级相同。两者的结合律为 右到左。

2)后缀++的优先级高于*和前缀++。 postfix ++ 的结合性是从左到右。

语言标准和大多数现代处理将前缀和后缀版本描述为不同的运算符,通过它们相对于操作数的位置来消除歧义。这个答案的其余部分解释了这是如何对同一事物进行另一种描述。

请注意,当仅涉及一元运算符时,仅在具有相同优先级的一个前缀和一个后缀运算符之间出现结合性问题。在仅包含前缀或仅包含后缀操作的链中,它们的关联方式没有任何歧义。例如,给定- - x,您不能将其有意义地分组为(- -) x。唯一的选择是- (- x).

接下来,观察所有最高优先级运算符都是后缀一元运算符,并且在 K&R 中,除了 ambi-fix 之外,所有第二优先级运算符都是前缀一元运算符++ and --。然后,将从右到左的关联性应用于第二优先级运算符,仅消除涉及后缀的表达式的歧义++ or --和前缀一元运算符,这样做有利于后缀运算符。这相当于区分这些运算符的后缀和前缀版本并为后缀版本分配更高优先级的现代方法。

为了获得现代描述的其余部分,请考虑我已经做出的观察,即仅当前缀和后缀运算符链接时,一元运算符才会出现结合性问题,并且所有最高优先级运算符都是后缀一元运算符。具有区分后缀++ and --作为单独的、比其前缀版本更高优先级的运算符,一could将它们放在其他后缀运算符和所有前缀运算符之间的自己的层中,但将它们与所有其他后缀运算符放在同一层中不会改变任何表达式的解释方式,并且更简单。这就是现在通常的表示方式,包括在您的第二个资源中。

至于从左到右vs.从右到左的关联性,对于仅包含前缀或仅包含后缀运算符的优先级来说,问题再次没有实际意义。然而,将后缀运算符描述为从左到右关联,将前缀运算符描述为从右到左关联与其操作的语义顺序一致。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

后缀/前缀运算符优先级和结合性 的相关文章

随机推荐