#cpp #language_lawyer #дизайн_языка
Оказалось, что постфиксные инкремент и декремент имеют более высокий приоритет, чем префиксные (источник). Правда, там же есть интересная фраза, смысл которой я не очень понимаю: "Стандарт не определяет порядок приоритетов. Они выводятся из грамматики языка." Если посмотреть на запись вида ++x++ и начать выбирать, что же первым хотел использовать программист, то возникает желание поменять эти приоритеты местами и сначала выполнить префиксный. Логика простая: каждый из этих операторов требует lvalue, но только префиксный возвращает lvalue. Получается, вычисление первым постфиксного оператора даёт rvalue и префиксный уже неприменим. Что я упускаю, и почему приоритеты выбраны именно так? Не вижу никакого вреда для совместимости с Си, если приоритеты расставить вот так: PS: На основе вопроса.
Ответы
Ответ 1
Языки С и С++ - разные, но родственные языки, имеющие общие исторические корни и очень схожий фундаментальный синтаксис. Основа грамматики языка С++ пришла из языка С, где так же как и в С++, все постфиксные операторы ([], (), ++, -> и т.п.) имеют более высокий приоритет, чем все префиксные (*, -, ++ и т.п.) Ни в языке С, ни в языке С++ нет и никогда не было некоего индивидуального "расставления приоритетов" операторов. Операторы фигурируют в грамматике сразу целыми классами терминальных символов. В данном случае это именно классы постфиксных и префиксных (aka унарных) операторов. При этом в языке С ваша логика неприменима. Одним из фундаментальных отличий языка С от языка С++ является то, что язык С не старается сохранить lvalue-ность результатов операторов без явной на то необходимости. В языке С и постфиксный, и префиксный ++ возвращает rvalue. Поэтому ваш вопрос фактически превращается в вопрос о том, почему грамматика С++ не была переделана на основе приведенных вами соображений о том, что в С++ префиксная форма ++ возвращает lvalue. Ответ: потому что приведенные вам соображения не достаточны в качестве основания для такой переделки. Негативный эффект от усложнения грамматики был бы заметен, а позитивный - ничтожен. И это все только ради возможности писать ++x++ вместо (++x)++?Ответ 2
Так легче для восприятия. Посмотри на таблицу приоритетов, сначала идут все постфиксные операторы, потом все префиксные, потом все бинарные. Убедительной причины делать исключения для ++ и -- не было. Нужно буть немного не здоровым, чтобы писать в коде ++x++.
Комментариев нет:
Отправить комментарий