При построении унарного оператора в дереве я обычно рисую его как дерево родитель-потомок, например:
-4
(-)
|
|
4
А при рисовании бинарного оператора в дереве у него будет левый и правый узел, что-то вроде:
2-4
-
/ \
2 4
Для меня это имеет смысл, когда должна быть ассоциативность с несколькими операторами, даже =
будет иметь левый и правый:
a=4
=
/ \
/ \
a (lv) 4 (rv)
Но я действительно не понимаю, почему унарный оператор — если в дереве синтаксического анализа есть только один дочерний элемент — имеет концепцию ассоциативности. Почему, например, унарный плюс/минус должен быть правоассоциативным, а не просто «неассоциативным» или «не имеет значения»?
Вот также полезный ответ: https://stackoverflow.com/a/14084830/12283181. А также:
Спецификация ассоциативности является избыточной для унарных операторов и показана только для полноты: унарные префиксные операторы всегда связывают справа налево (sizeof +*p равно sizeof(++(*p))), а унарные постфиксные операторы всегда связывают слева направо. -right (a[1][2]++ равно ((a[1])[2])++). Обратите внимание, что ассоциативность имеет смысл для операторов доступа к членам, даже если они сгруппированы с унарными постфиксными операторами: a.b++ анализируется (a.b)++, а не a.(b++).
Источник: C++ Operator Precedence