gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:43:22 30 4
gpt4 key购买 nike

我对后缀/前缀运算符的优先级关联性 感到困惑。

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

(*ip)++

The parentheses are necessary in this last example; without them, the expression would increment ip instead of what it points to, because unary operators like * and ++ associate right to left.

没有提及任何后缀/前缀运算符之间的关联性差异。两者一视同仁。该书还指出 * 和++ 具有相同的优先级。

另一方面,this page指出:

1) Precedence of prefix ++ and * is same. Associativity of both is right to left.

2) Precedence of postfix ++ is higher than both * and prefix ++. Associativity of postfix ++ is left to right.

我应该相信哪一个?多年来,它是否随着 C 修订版而发生了变化?

最佳答案

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

On one hand, as I'm reading K&R book, it states that:

(*ip)++

The parentheses are necessary in this last example; without them, the expression would increment ip instead of what it points to, because unary operators like * and ++ associate right to left.

没有提及两者之间的关联性差异 后缀/前缀运算符。两者一视同仁。本书还 声明 * 和++ 具有相同的优先级。

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

On the other hand, this page states that:

1) Precedence of prefix ++ and * is same. Associativity of both is right to left.

2) Precedence of postfix ++ is higher than both * and prefix ++. Associativity of postfix ++ is left to right.

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

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

接下来,观察所有最高优先级运算符都是后缀一元运算符,并且在 K&R 中,所有第二优先级运算符都是前缀一元运算符,除了 ambi-fix ++ --。然后,将从右到左的结合性应用于第二优先运算符,只消除涉及后缀 ++-- 和前缀一元运算符的表达式的歧义,并在支持后缀运算符。这等同于区分这些运算符的后缀和前缀版本并为后缀版本分配更高优先级的现代方法。

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

至于从左到右 从右到左的结合性,问题是,对于仅包含前缀或仅包含后缀运算符的优先级层,没有实际意义。但是,将后缀运算符描述为从左到右关联,将前缀运算符描述为从右到左关联,这与其语义运算顺序是一致的。

关于c - 后缀/前缀运算符优先级和结合性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56740022/

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