为什么 C++ 允许重复 + 运算符,例如 x = 1 + + + + + + + + 2;
Why C++ allows repeated + operators, like in x = 1 + + + + + + + + 2;
令我惊讶的是 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);
}
在 C++ 中,可以重载运算符。 Boost Spirit 是一个特别好的用例;使用 C++ 语法表示 EBNF 语法。
在这种情况下,能够重复 +
个运算符可能会很有用。
(个人例子:我有一些现金流量建模代码,使用+
提前一个周期。自然++
提前两个周期。我也使用<<
和>>
在账户之间转移现金。它非常易读 - 如果我自己可以这么说的话!)
语法定义一元运算符要容易得多
*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*
你的投诉最好通过代码审查来解决,而不是语法更改
令我惊讶的是 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);
}
在 C++ 中,可以重载运算符。 Boost Spirit 是一个特别好的用例;使用 C++ 语法表示 EBNF 语法。
在这种情况下,能够重复 +
个运算符可能会很有用。
(个人例子:我有一些现金流量建模代码,使用+
提前一个周期。自然++
提前两个周期。我也使用<<
和>>
在账户之间转移现金。它非常易读 - 如果我自己可以这么说的话!)
语法定义一元运算符要容易得多
*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*
你的投诉最好通过代码审查来解决,而不是语法更改