将一元运算符联合起来是否有意义?

Luc*_*ore 15 c++ operators unary-operator associativity

来自http://en.cppreference.com/w/cpp/language/operator_precedence的C++运算符优先级表(我知道它不是规范性的,但标准不讨论优先级或关联性)将一元运算符标记为右/左关联.

从对不同问题的讨论中,我怀疑.将一元运算符联合起来是否有意义?

Ste*_*sop 10

它只是从语法中得出关联性的方式的人工制品.

加法是左关联的原因是加法表达的产生之一加法表达 + 乘法表达,左边是加法表达式.所以当你看到:

a + b + c
Run Code Online (Sandbox Code Playgroud)

这必须等于(a + b) + c,因为以匹配生产的唯一方法是使用a + b作为添加剂的表达c作为乘法表达.a对自己是一种添加剂表达,但b + c不是乘法表达式a + b + c,如果我们试图采取不符合生产a作为添加剂表达.

如果你以前没有,我建议你阅读忽略语义的"表达式"一章:只看语法作品.然后你会看到优先级和关联性是如何由语法定义的.最大的诀窍是每个"高优先级"类型的表达式IS-A"低优先级"类型的表达式.因此,每个乘法表达式都是一个加法表达式,但反之亦然,这就是使乘法"绑定更紧"而不是加法的原因.

前缀一元运算符在语法中定义如:unary-expression:++ cast-expression等,左侧为运算符,前缀为运算符,右侧为后缀.换句话说,我们在左边插入括号"forfix",在右边插入前缀.也就是说,我们可以说,对于后缀运算符,分组是从左到右,对于前缀运算符,从右到左分组.事实上,C++标准正是如此(C++ 03中的5.2/1和5.3/1).可能是滥用术语或至少是一个新的造币来将这种一元分组称为"关联性".但它并不是一个重要因素,因为它显然必须具有什么意义.

二元运算符和一元运算符之间的唯一区别是,如果二进制运算符按相反方向分组,则语法仍然有意义,因此a - b - c意味着a - (b - c).这将是令人惊讶的,但不会影响语言.随着一元运算符会比惊讶地集团更!!a因为(!!)a,语言也必须提供一个意义的子表达式!!,目前它没有.函数式语言可以赋予它一个含义:!!可能意味着函数由!和组成!,即操作相同static_cast<bool>(),但C++没有组成函数或运算符的概念.C++不需要提供这种含义的原因是!"从右到左".哪个(因为语法中的大技巧)只是另一种说法,!!它不是语法正确的表达式所以永远不是任何东西的子表达式.

所以,是的,这确实是有意义的说,前缀运算组右到左,左到右的后缀操作员组.但是,由于我们了解C++语言的其他事情,它也必须是这样"显而易见".

顺便说一句,我认为,在C技术上来说++至少,后缀++不是一元运算符.它是一个后缀运算符.但这确实无关紧要,除非它是标准中的术语,因为很明显它是一个运算符并且它有一个操作数,因此英语中的"一元".