Честный ответ: я не знаю.
елившись таким образом, мы не можем сделать ни++x++
ни++x--
, Но с другой стороны, оба(++x)++
а также(++x)--
полезные выражения:(++x)++
приращенийx
на два и возвращает значение «посередине», а(++x)--
по существу эквивалентноx+1
но полностью избегает необходимости звонитьoperator+
, что иногда может быть весьма полезным.
Итак, почему приоритет не определен, чтобы иметь++x++
автоматически расширяться до(++x)++
скорее, чем++(x++)
? Есть ли какой-то скрытый смысл для последнего, который я не понимаю, или это просто чтобы сохранить приоритет простым списком со всеми префиксными операторами, составляющими один единственный уровень?
РЕДАКТИРОВАТЬ Хорошо, я не сказал это явно, но: конечно, я имел в видуx
быть пользовательским типом. Для встроенных типов,(x+=2)-1
конечно лучше чем(++x)++
, а такжеx+1
этомного лучше чем(++x)--
, Ситуация, которую я имею в виду, это итератор для довольно сложного типа полуассоциативного контейнера, где операторы+=
а также+
(предназначенные для произвольного доступа) должны перестроить кэш, чтобы эффективно работать для общих запросов, и поэтому они на порядок медленнее, чем++
, Но, конечно, я могу изменить их, чтобы всегда сначала проверять, является ли аргумент очень маленьким целым числом, и в этом случае просто вызватьoperator++
несколько раз вместо выполнения процедуры произвольного доступа. Это должно работать нормально, хотя я мог бы предположить, что в какой-то момент у меня может возникнуть ситуация, в которой я хочуoperator+=
всегда идти по пути произвольного доступа, независимо от того, насколько маленькими числами я его представляю.
преимущество наличия простого и хорошо запоминающегося списка приоритетов, в которомвсе операторы postfix предшествуютЛюбые префиксных операторов достаточно, чтобы допустить незначительный недостаток, заключающийся в необходимости всегда использовать скобки для составления пре- и постфиксных операторов.++
/--
Так как эта композиция используется очень редко.
Более простое «C делает это таким образом», в то время как, вероятно,реальный причина, гораздо менее удовлетворительным для меня, потому что с++x++
не было разрешеновообще в Си было бы возможно переопределить эту самую композицию, не повреждая любой существующий код.
Во всяком случае, я буду продолжать использовать(++x)--
, как скобки действительно не так больно.