C++ 为什么是C++;允许重复+;运算符,如x=1++++++++;2.

C++ 为什么是C++;允许重复+;运算符,如x=1++++++++;2.,c++,language-lawyer,grammar,C++,Language Lawyer,Grammar,令我惊讶的是: P>我知道C++有奇怪的复杂语法(并且它试图允许所有的C代码都是有效的),所以我假设这是允许的,但是有一些好的积极的原因,我们不希望这个代码被禁止吗? 编辑:更奇怪的案例: int main() { constexpr int x = 1 + - - + + + 2; static_assert(x==3); } 在C++中,可以重载运算符。Boost Spirit是一个特别好的用例;用C++文法表示EBNF文法。< /P> 在这种情况下,能够使用重复的+运算

令我惊讶的是:

<> P>我知道C++有奇怪的复杂语法(并且它试图允许所有的C代码都是有效的),所以我假设这是允许的,但是有一些好的积极的原因,我们不希望这个代码被禁止吗? 编辑:更奇怪的案例:

int main()
{
    constexpr int x = 1 + - - + + + 2;
    static_assert(x==3);
}

在C++中,可以重载运算符。Boost Spirit是一个特别好的用例;用C++文法表示EBNF文法。< /P> 在这种情况下,能够使用重复的
+
运算符可能会很有用


(一个个人例子:我有一些现金流建模代码,它使用
+
提前一段时间。当然
+
提前两段时间。我还使用
在账户之间移动现金。如果我自己可以这么说的话,它非常可读!)语法定义一元运算符要容易得多

*expression*: /* other things */
              *unary-expression*
              /* more things */

*unary-expression*: + *expression*
                    - *expression*


您的抱怨可以通过代码检查得到更好的解决,而不是语法更改

另请参见扩展(邪恶)宏也可能产生类似的代码。@Nosenseal只有一个是二进制的,其余的是二进制的unary@NoSenseEtAl:标记被分组为
1+(-(+(+(+2-))))
请注意,虽然在运算符重载中使用可能有利于允许多个一元运算符,但这不是原因。C++继承了它在C方面的规则,而C没有操作符重载。另外,几乎所有其他语言的工作方式都是一样的,不管它是否有运算符重载。为什么禁止它,也许是一个更好的问题(而不是DVer)@underline\d一开始我以为你在说你不是:David Vandevoord:)至于downvote:我认为这个问题很好,只是不是很有用,它更像是一个语言琐事,注意,将语法更改为不允许
++x
(这其实并不复杂)仍将允许
+(+x)
,而不允许这将非常困难,而且可能无法使用LR解析器。
*expression*: /* other things */
              *unary-expression*
              /* more things */

*unary-expression*: + *expression*
                    - *expression*
*expression*: /* other things */
              *unary-expression*
              /* more things */

*non-unary-expression*: /* other things */
                        /* more things */

*unary-expression*: + *non-unary-expression*
                    - *non-unary-expression*