【问题标题】:Why C++ allows repeated + operators, like in x = 1 + + + + + + + + 2;为什么 C++ 允许重复 + 运算符,例如 x = 1 + + + + + + + + 2;
【发布时间】:2021-04-30 10:22:11
【问题描述】:

令我惊讶的是compiles fine

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

我知道 C++ 有奇怪的复杂语法(它试图让所有 C 代码都有效),所以我认为这就是允许这样做的原因,但是有什么好的积极理由可以说明我们不想要这段代码被禁了?

编辑:更离奇的案例工作:

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

【问题讨论】:

  • 为什么禁止它,也许是一个更好的问题(不是 DVer)
  • @underscore_d 起初我以为你是说你不是:David Vandevoorde :) 至于否决票:我认为问题很好,只是不是很有用,它更像是一种语言琐事,而不是在日常工作中需要了解的有用信息。

标签: c++ language-lawyer grammar


【解决方案1】:

在 C++ 中,可以重载运算符。 Boost Spirit 是一个特别好的用例;使用 C++ 文法来表示 EBNF 文法。

在这种情况下,能够重复使用 + 运算符可能会很有用。

(个人示例:我有一些现金流建模代码使用+ 提前一个周期。自然++ 提前两个周期。我还使用<<>> 在帐户之间转移现金. 它的可读性非常好——如果我自己可以这么说的话!)

【讨论】:

  • 扩展(邪恶)宏也可能产生类似的代码。
  • @NoSenseEtAl 只有一个是二元的,其余的是一元的
  • @NoSenseEtAl:令牌被分组1 + (- (- (+ (+ (+ 2)))))
  • 请注意,虽然在运算符重载中使用可能是允许多个一元运算符的好处,但这不是原因。 C++ 在这方面从没有运算符重载的 C 继承了它的规则。此外,几乎所有其他语言的工作方式都相同,无论是否有运算符重载。
【解决方案2】:

语法定义一元运算符要容易得多

*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*

您的投诉最好通过代码审查而不是语法更改来解决

【讨论】:

  • 请注意,将语法更改为禁止+ + x(实际上不会那么复杂)仍然允许+ (+ x),并且禁止使用LR解析器会困难得多,而且可能不可能.
猜你喜欢
  • 1970-01-01
  • 2010-09-10
  • 2014-12-03
  • 2012-10-30
  • 1970-01-01
  • 2011-08-28
  • 2011-09-04
  • 2018-05-17
相关资源
最近更新 更多