为什么C中的运算符之间存在不同的关联性?

为什么C中的运算符之间存在不同的关联性?,c,operators,associativity,C,Operators,Associativity,谈到C中运算符的关联性,我想知道为什么具有相同优先级的运算符之间的关联性存在差异。例如,后缀增量和后缀减量具有左关联性;而前缀递增和前缀递减具有正确的关联性。对于所有相同的优先级运算符,只具有左或右关联性不是很简单吗 这背后有什么原因吗 对于所有对象,只有左或右关联性不是很简单吗 相同的优先级运算符 是的,还有您可能认为前缀和后缀具有相同的优先级,这是错误的。后缀的优先级高于前缀 [P>]还有一个奇怪的情况要考虑为什么某些算子具有一定的关联性。从 例如,在C中,赋值a=b是一个返回 具有以下副作

谈到C中运算符的关联性,我想知道为什么具有相同优先级的运算符之间的关联性存在差异。例如,后缀增量和后缀减量具有左关联性;而前缀递增和前缀递减具有正确的关联性。对于所有相同的优先级运算符,只具有左或右关联性不是很简单吗

这背后有什么原因吗

对于所有对象,只有左或右关联性不是很简单吗 相同的优先级运算符

是的,还有您可能认为前缀和后缀具有相同的优先级,这是错误的。后缀的优先级高于前缀

[P>]还有一个奇怪的情况要考虑<强>为什么某些算子具有一定的关联性<强>。从

例如,在C中,赋值a=b是一个返回 具有以下副作用的值(即,b转换为a类型) 将a设置为此值。可以在中间执行赋值。 一种表达方式。(一个表达式可以通过 在它后面加一个分号;即a=b是一个表达式,但a=b; 这是一份声明)。=运算符的右关联性允许 将a=b=c等表达式解释为a=(b=c), 从而将a和b都设置为c的值。备选方案(a)= b) =c没有意义,因为a=b不是左值


二进制运算符都是左关联的,除了赋值运算符是右关联的


后缀运算符有时(例如在K&R第二章中)被称为右结合运算符,但这是为了表达它们比一元运算符具有更高的优先级

K&R(第二版,第48页)中的表格是C中运算符优先级混乱的罪魁祸首。在这里,他们错误地将后缀和前缀放在同一个优先级组中,这是错误的。这是K&R不应该用于教/学C的许多原因之一,这本书充满了错误和糟糕的实践。@lundin,有趣的是,C的创造者的书竟然充满了错误@沙巴兹这并不奇怪,真的。最初的书是在黑暗时代写的,甚至在C语言被标准化之前,甚至在良好的编程实践被发明之前。这本书在ANSI/ISO标准化的基础上更新到第二版,但仍然继承了过去的许多错误和奇怪之处。而且这本书还没有更新到最新的标准。任何超过20年的计算机科学书籍都应该被认为是过时的。