我一直想弄清楚,将链接和复合赋值操作符链在一起总是从右到左可预测地工作?例如:
a = b += c
这总是被评估为
a = (b += c)
无论其他复合运算符和运算符的顺序我替换?
今天有几次我一直犹豫不决,将这些不同的运营商联系在一起,却不知道如何评估优先级。我通常引用的source是不明确的,因为它表示,即使这些运算符具有相同的优先级,那么"在某行上列出的运算符将更严格地绑定(就像通过括号一样)它的参数比在其下面的行上列出的任何运算符都要多。" - 这表明普通分配操作符可能会更严格地绑定"至a
&在上面的示例中,b
比复合赋值运算符更靠b
和c
。
答案 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
都是b
,c
可以表示b
以外的任何其他内容的唯一方式,如果有的话这些表达式包含运算符,您链接的页面列为优先级15或更高。
如果d, e
实际上是a = d, e += c
表达式,那么就是一个例子:(a = d), (e += c)
自然意味着a = ((d, e) += c
,而不是{{1}}。