2014-09-06 67 views
2

我一直在试图弄清楚,将链接在一起的赋值和复合赋值操作符总是可​​以从右到左预测工作吗?例如:混合赋值和复合赋值运算符 - 优先级?

a = b += c 

这会不会总为

a = (b += c) 

不管什么评价其他复合运营商和运营商的订单我替补?

今天有好几次,当我一直犹豫不决将这些不同的操作符链接在一起时,并不知道如何评估优先级。我通常提到的source是不明确的,因为它说,尽管这些运算符具有相同的优先级,但“在某行上列出的运算符将被绑定得比它的参数更紧密(就像用括号)在它下面的一行中列出。“ - 这表明在上面的例子中,明文赋值运算符可能会被绑定到a & b以上的复合赋值运算符是bc

回答

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++中,一个初始化子句或者是一个勘定表达式braced-init-list; C语法更清楚地表明右操作数可以是一个赋值表达式,这使得它是正确关联的。

+0

感谢您的报价! – jramm 2014-09-06 00:35:18

+0

@ user2864740:'a * = b + = c'等于'a * =(b + = c)'(因为它们从右到左分组)。 – 2014-09-06 00:42:56

+1

为什么downvote? – 2014-09-06 01:28:20

0

“的行进一步在其下方”并不是指+=出现在线下面=,它指的是throw,出现在它下面的行,与由边界分开的表中的行。

其中a = b += c可能意味着什么比(a) = ((b) += (c))等,假设abc都是有效的表达式的唯一方法,就是是否有这些表达式包含你的网页链接到列表中的优先级为15或更高的运营商。

这方面的一个例子是,如果b实际上是表达d, ea = d, e += c自然意味着(a = d), (e += c),不a = ((d, e) += c

+0

感谢您的澄清。我认为我链接的源代码是令人困惑的,因为它使用了* p ++的例子,它有两个我认为是在同一个单元格中的操作符,但是它说的是在不同的行中。我现在看到,后缀运算符++比前缀运算符++具有更高的优先级 – jramm 2014-09-06 00:44:34