Я просто наткнулся на следующей паре правил грамматики 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)
, предлагая =
связывает сильнее.
Является ли понятие приоритетом оператора в традиционном смысле здесь просто не применимо? Зачем?
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. " Но это относится к другому случаю кромки. –
Wikipedia также отмечает, что в 'C' он описывается как' логическое-OR-выражение? выражение: условное выражение', отличное от C++ –
@MooingDuck О, эта запятая интересная! – fredoverflow