Синтаксически, это постфиксный оператор. Возможно, было бы лучше назвать это семейством постфиксных операторов, по одному для каждого юридического идентификатора, который может следовать за ним.
Это похоже на индексную запись v[a]
, которая также лучше воспринимается синтаксически как постфиксный оператор (с разделителями), даже если у него два значения в качестве операндов. Таким же образом мы можем назвать так называемый троичный оператор cond ? alt1 : alt0
двоичным оператором с разделителями. Синтаксически, оператором является ? alt1:
Это представление о синтаксисе, которое на первый взгляд может показаться немного странным, происходит из описания грамматики оператора, которая в основном имеет вид, используя ⟨⟩
для группировки и *
для необязательного повторения (т. Е. 0 или более экземпляры, как в регулярных выражениях).
⟨ PREFIX* OPERAND POSTFIX* ⟩ ⟨ INFIX ⟨ PREFIX* OPERAND POSTFIX* ⟩ ⟩*
Эта формулировка обрабатывает скобки, включая ( EXPRESSION )
в OPERAND
(рекурсивно), для скобок - для группировки, и включая ( EXPRESSION_LIST )
в POSTFIX
для скобок, используемых в вызовах функций.
Глядя на выражения таким образом, облегчает анализ. Это также помогает прояснить, что подразумевается под приоритетом и ассоциативностью, особенно для операторов с разделителями.
Общее правило приоритета операторов заключается в том, что мы начинаем с предоставления всем постфиксным операторам одинакового наивысшего приоритета. Это не является теоретически необходимым, но почти всегда приводит к ожидаемому значению. Никто не будет интерпретировать 2+sin(0.5)
как вызов "функции" 2+sin
. Более актуально для вашего вопроса: 2+s.size
интуитивно означает, что .size
сначала применяется к s
, а затем к результату добавляется 2.