混合赋值和复合赋值运算符 - 优先级?

时间:2014-09-06 00:11:53

标签: c++

我一直想弄清楚,将链接和复合赋值操作符链在一起总是从右到左可预测地工作?例如:

a = b += c

这总是被评估为

a = (b += c)

无论其他复合运算符和运算符的顺序我替换?

今天有几次我一直犹豫不决,将这些不同的运营商联系在一起,却不知道如何评估优先级。我通常引用的source是不明确的,因为它表示,即使这些运算符具有相同的优先级,那么"在某行上列出的运算符将更严格地绑定(就像通过括号一样)它的参数比在其下面的行上列出的任何运算符都要多。" - 这表明普通分配操作符可能会更严格地绑定"至a&在上面的示例中,b比复合赋值运算符更靠bc

2 个答案:

答案 0 :(得分:4)

所有赋值运算符都具有相同的优先级,并且它们从右到左分组。

从语义上讲,+=运算符是=+的组合,但从语法上讲,它本身就是一个运算符,它的语法决定了它优先权。

引用C ++标准,语法为:

assignment-expression:
    conditional-expression
    logical-or-expression assignment-operator initializer-clause
    throw-expression

assignment-operator: one of
     = *= /= %= += -= >>= <<= &= ^= |=

C语法有点简单:

assignment-expression:
    conditional-expression
    unary-expression assignment-operator assignment-expression

在C ++中, initializer-clause 赋值表达式 braced-init-list ; C语法更清楚地表明右操作数可以是赋值表达式,这使得它是右关联的。

答案 1 :(得分:0)

&#34;在它下面的一排&#34;不会引用+=下面上显示的=,它指的是上显示的throw,在它下面的行,表格行以边框分隔。

假设a = b += c(a) = ((b) += (c))a都是bc可以表示b以外的任何其他内容的唯一方式,如果有的话这些表达式包含运算符,您链接的页面列为优先级15或更高。

如果d, e实际上是a = d, e += c表达式,那么就是一个例子:(a = d), (e += c)自然意味着a = ((d, e) += c,而不是{{1}}。