Страницы

Поиск по вопросам

воскресенье, 15 декабря 2019 г.

Почему приоритет постфиксного инкремента больше чем префиксного?

#cpp #language_lawyer #дизайн_языка


Оказалось, что постфиксные инкремент и декремент имеют более высокий приоритет, чем
префиксные (источник). Правда, там же есть интересная фраза, смысл которой я не очень
понимаю: "Стандарт не определяет порядок приоритетов. Они выводятся из грамматики языка."

Если посмотреть на запись вида ++x++ и начать выбирать, что же первым хотел использовать
программист, то возникает желание поменять эти приоритеты местами и сначала выполнить
префиксный. Логика простая: каждый из этих операторов требует lvalue, но только префиксный
возвращает lvalue. Получается, вычисление первым постфиксного оператора даёт rvalue
и префиксный уже неприменим.

Что я упускаю, и почему приоритеты выбраны именно так?

Не вижу никакого вреда для совместимости с Си, если приоритеты расставить вот так:



PS: На основе вопроса.
    


Ответы

Ответ 1



Языки С и С++ - разные, но родственные языки, имеющие общие исторические корни и очень схожий фундаментальный синтаксис. Основа грамматики языка С++ пришла из языка С, где так же как и в С++, все постфиксные операторы ([], (), ++, -> и т.п.) имеют более высокий приоритет, чем все префиксные (*, -, ++ и т.п.) Ни в языке С, ни в языке С++ нет и никогда не было некоего индивидуального "расставления приоритетов" операторов. Операторы фигурируют в грамматике сразу целыми классами терминальных символов. В данном случае это именно классы постфиксных и префиксных (aka унарных) операторов. При этом в языке С ваша логика неприменима. Одним из фундаментальных отличий языка С от языка С++ является то, что язык С не старается сохранить lvalue-ность результатов операторов без явной на то необходимости. В языке С и постфиксный, и префиксный ++ возвращает rvalue. Поэтому ваш вопрос фактически превращается в вопрос о том, почему грамматика С++ не была переделана на основе приведенных вами соображений о том, что в С++ префиксная форма ++ возвращает lvalue. Ответ: потому что приведенные вам соображения не достаточны в качестве основания для такой переделки. Негативный эффект от усложнения грамматики был бы заметен, а позитивный - ничтожен. И это все только ради возможности писать ++x++ вместо (++x)++?

Ответ 2



Так легче для восприятия. Посмотри на таблицу приоритетов, сначала идут все постфиксные операторы, потом все префиксные, потом все бинарные. Убедительной причины делать исключения для ++ и -- не было. Нужно буть немного не здоровым, чтобы писать в коде ++x++.

Комментариев нет:

Отправить комментарий