一元运算符具有关联性有意义吗? C++运算符优先级表(我知道它不是规范的,但标准不谈论优先级或关联性)将一元运算符标记为右/左关联。

一元运算符具有关联性有意义吗? C++运算符优先级表(我知道它不是规范的,但标准不谈论优先级或关联性)将一元运算符标记为右/左关联。,c++,operators,unary-operator,associativity,C++,Operators,Unary Operator,Associativity,从对另一个问题的讨论中,我感到怀疑。一元运算符具有关联性有意义吗?不确定,但如果下列条件有效,则是 ++i-- 但事实并非如此,并抛出了错误 lvalue required as increment operand 一元运算符的所有行为都只能用优先级来解释。一元运算符中运算符的关联性只决定了运算符出现在操作数的哪一侧。这只是关联性从语法中派生出来的方式的产物 加法是左关联的原因是加法表达式的一个乘积是加法表达式+乘法表达式,加法表达式位于左侧。所以当你看到: a + b + c 这必须等同


从对另一个问题的讨论中,我感到怀疑。一元运算符具有关联性有意义吗?

不确定,但如果下列条件有效,则是

++i--
但事实并非如此,并抛出了错误

lvalue required as increment operand

一元运算符的所有行为都只能用优先级来解释。

一元运算符中运算符的关联性只决定了运算符出现在操作数的哪一侧。

这只是关联性从语法中派生出来的方式的产物

加法是左关联的原因是加法表达式的一个乘积是加法表达式+乘法表达式,加法表达式位于左侧。所以当你看到:

a + b + c
这必须等同于
(a+b)+c
,因为匹配生产的唯一方法是将
a+b
作为加法表达式,将
c
作为乘法表达式
a
本身是一个加法表达式,但
b+c
不是乘法表达式,因此如果我们尝试将
a
作为加法表达式,则
a+b+c
与乘积不匹配

如果您以前没有读过,我建议您通读“表达式”一章,忽略语义:只看语法结果。然后您将看到语法是如何定义优先级和关联性的。最大的诀窍是每个“高优先级”类型的表达式都是“低优先级”类型的表达式。所以每个乘法表达式都是加法表达式,但不是相反,这就是乘法比加法“绑定更紧密”的原因

前缀一元运算符在语法中定义,如:一元表达式:++cast表达式等,左边的运算符表示前缀,右边的运算符表示后缀。换句话说,我们在左边“插入括号”表示后缀,在右边表示前缀。也就是说,对于后缀运算符,我们可以说分组是从左到右的,对于前缀运算符,分组是从右到左的。事实上,C++标准完全说明了(C++ 03中的5.2/1和5.3/1)。将这种一元组合称为“联想性”可能是对术语的滥用,或者至少是一种新的造币术。但这并不是一个重要的问题,因为很明显,这意味着什么

这里二元运算符和一元运算符之间的唯一区别是,如果二元运算符按相反方向分组,语法仍然有意义,因此
a-b-c
表示
a-(b-c)
。这将是令人惊讶的,但不会影响语言。使用一元运算符时,组
会更加令人惊讶!!a
作为
(!!)a
,该语言还必须为子表达式
提供含义,它当前没有。函数式语言可以赋予它一种含义:
可能表示由
组成的函数
,即与 StasyCaseCube()/Cuth>相同的操作,但C++没有组成函数或运算符的概念。C++不需要提供那个意思的原因是<代码>!代码>“从右到左分组”。这(因为语法中的大技巧)只是另一种说法
不是语法正确的表达式,因此永远不是任何内容的子表达式

所以说前缀操作符从右向左分组,后缀操作符从左向右分组是有道理的。但它也“显而易见”,它必须是这样的,因为我们知道的其他关于C++语言的东西。
++< /COD>不是一元运算符。这是一个后缀运算符。但这真的不重要,除了标准中的术语,因为很明显,它是一个运算符,有一个操作数,英语中的“一元数”也是如此

int *p;
*p++;
表达式
*p++
可以计算为
(*p)+
(增加p指向的对象)或
*(p++)
(指向p指向的下一个对象)

因为一元运算符是右关联的,所以表达式
*p++
将被计算为
*(p++)
。(我是在读《克尼汉和里奇》时想到这个的。)

似乎优先级和关联性已更改,后缀
++
的优先级高于取消引用
*
运算符

根据C11,上述表达式的计算结果为
*(p++)

我希望这能更清楚地解释为什么一元运算符具有关联性


感谢您指出这一点。

@LuchianGrigore,它们是不同的运算符。啊,是的,它们出现了两次-前缀前加后缀。因此,底线是,它们是关联的,只是与其他运算符的意义不同?@LuchianGrigore是的,因为它们不能具有与二进制运算符相同的歧义性,但是,当一元运算符位于两个可能的操作数之间时,您必须找出它适用于哪一个操作数。您能给出一个歧义的示例吗?不,后缀的优先级高于前缀。请参见此处的我的答案()和一个具有左关联前缀运算符的连字符语言示例请参见此处的答案(stackoverflow.com/a/14084830/1740808)例如,使用具有左关联前缀运算符的连字符语言PostFix是从左到右关联的-,因此参数不成立。此外,本例中的求值顺序由优先级决定,因为后增量的优先级高于取消引用。感谢您的深入了解。我认为一元运算符没有关联性因为同一个操作