2015-03-27 2 views
8

Я просто наткнулся на следующей паре правил грамматики C++:Является ли привязка или условная привязка сильнее?

conditional-expression: 
    logical-or-expression 
    logical-or-expression ? expression : assignment-expression 
             ^^^^^^^^^^^^^^^^^^^^^ 
assignment-expression: 
    conditional-expression 
    ^^^^^^^^^^^^^^^^^^^^^^ 
    unary-expression assignment-operator assignment-expression 
    throw assignment-expression_opt 

Обратите внимание, как правила, взаимно рекурсивная: условно-выражения относится к присваивания выражение- (правило 2), и assignment- выражение относится к условное выражение (правило 1).

Что это означает в отношении приоритета оператора? Обычно нетерминал для оператора с более сильной связью встречается в правой части правил для оператора с более слабым связыванием, но не наоборот, правильно? Вот что меня озадачивает, в частности:

С одной стороны, a = b ? c : d означает a = (b ? c : d), предлагая ?: связывает сильнее.

С другой стороны, a ? b : c = d означает a ? b : (c = d), предлагая = связывает сильнее.

Является ли понятие приоритетом оператора в традиционном смысле здесь просто не применимо? Зачем?

+2

http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B «Таблица приоритетов, в то время как в основном адекватная, не может решить несколько деталей. В частности, обратите внимание, что тернарный оператор допускает любое произвольное выражение как его среднее операнд, несмотря на то, что он имеет более высокий приоритет, чем операторы присваивания и запятой. Таким образом, a? b, c: d интерпретируется как a (b, c): d, а не как бессмысленный (a? b), (c : d) Кроме того, обратите внимание, что непосредственный, несферированный результат выражения C cast не может быть операндом sizeof. " Но это относится к другому случаю кромки. –

+0

Wikipedia также отмечает, что в 'C' он описывается как' логическое-OR-выражение? выражение: условное выражение', отличное от C++ –

+0

@MooingDuck О, эта запятая интересная! – fredoverflow

ответ

6

?: и = имеют одинаковую приоритетность оператора и привязывают справа налево.

См. cppreference.

+0

Интересно. Наверное, меня отбросило из-за того, что другие ресурсы [подобные этому] (https://msdn.microsoft.com/en-us/library/126fe14k.aspx) утверждают, что '?:' Связывает более жесткие, чем '=' , – fredoverflow