2014-09-06 4 views
2

Я пытался выяснить, будут ли цепочки присвоения и сложные операторы присваивания всегда будут работать предсказуемо справа налево? Пример:Операции смешивания и составные операторы присваивания - Приоритет?

a = b += c 

Будет это всегда быть оценены как

a = (b += c) 

независимо от того, что другие операторы соединения и порядок операторов я заменить?

Было несколько раз сегодня, когда я колебался, чтобы связать этих разных операторов вместе, не зная точно, как будет оцениваться приоритет. source Я обычно ссылаюсь на неоднозначность, потому что он говорит, что, хотя эти операторы имеют одинаковый уровень приоритета, «оператор, который указан в некоторой строке, будет привязан к его аргументам более жестко (как если бы они были в скобках), чем любой оператор, который указан ниже в строке. " - это говорит о том, что простой оператор назначения может быть «привязан более жестким» до a & b, чем оператор составного назначения равен b и c в приведенном выше примере.

ответ

4

Все операторы присваивания имеют одинаковый приоритет, и они группируются справа налево.

семантически, оператор += представляет собой сочетание = и +, но синтаксически это оператор сам по себе, и это синтаксис, который определяет приоритет.

Цитирование стандарт C++, синтаксис:

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

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

Синтаксис С немного проще:

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

В C++, инициализатор-раздел является либо assignment- выражение или braced-init-list; C-грамматика дает четкое представление о том, что правый операнд может быть присваиванием-выражением, что делает его право-ассоциативным.

+0

Спасибо за цитату! – jramm

+0

@ user2864740: 'a * = b + = c' эквивалентно' a * = (b + = c) '(так как они группируются справа налево). –

+1

Почему downvote? –

0

«строка ниже него» не относится к += появляться на линии ниже =, это относится к throw и , появляющимся на строки под ним, с строками таблицы, разделенных границами.

Единственный способ, в котором a = b += c может означать ничего другого, кроме (a) = ((b) += (c)), предполагая, что a, b и c все допустимые выражения, то, если любой из этих выражений содержит операторы, страница, которую вы ссылаются на списки, как уровень приоритета 15 или выше.

Примером этого было бы, если b на самом деле выражение d, e: a = d, e += c естественно означает (a = d), (e += c), не a = ((d, e) += c.

+0

Спасибо за разъяснение. Я думаю, что источник, который я связал, запутан, потому что он использует пример * p ++, который имеет два оператора, которые, как я думал, были в одной и той же ячейке, но они говорят о том, что они находятся в разных строках. Теперь я вижу, что постфиксный оператор ++ имеет более высокий приоритет, чем префикс operator ++ – jramm

Смежные вопросы