Рекомендации по приоритету операторов Java - PullRequest
20 голосов
/ 26 января 2010

Непонимание Приоритет Java-оператора является источником часто задаваемых вопросов и мелких ошибок. Я был заинтригован, узнав, что даже спецификация языка Java гласит: «Рекомендуется, чтобы код не полагался критически на эту спецификацию». JLS §15.7 Предпочтение от ясно до умно , есть ли какие-либо полезные рекомендации в этой области?

Вот несколько ресурсов по теме:

Дополнения или исправления приветствуются.

Ответы [ 6 ]

20 голосов
/ 26 января 2010

Что касается "Реального мира", то, вероятно, справедливо сказать:

  • достаточно программистов знают, что умножение / деление имеет приоритет над сложением / вычитанием, что математически является соглашением
  • вряд ли кто-либо из программистов сможет вспомнить какие-либо другие правила старшинства

Таким образом, кроме конкретного случая */ против +-, я бы просто использовал скобки для явного определения предполагаемого приоритета.

5 голосов
/ 15 февраля 2010

Еще один связанный источник ошибок - как накапливаются ошибки округления. Не проблема порядка приоритетов операторов как таковая, а источник удивления, когда вы получаете другой результат после перестановки операндов арифметически эквивалентным способом. Вот версия sun.com Дэвида Голдберга , что должен знать каждый компьютерщик об арифметике с плавающей точкой .

4 голосов
/ 13 ноября 2012

Цитата (из Спецификация языка Java §15.7 ) должна читаться в контексте Порядок оценки . Как обсуждалось здесь , этот раздел касается порядка оценки , который не связан с оператором приоритет (или ассоциативность ).

Приоритет и ассоциативность влияют на структуру дерева выражений (то есть какие операторы действуют на какие операнды), в то время как «порядок вычисления» просто влияет на порядок, в котором дерево выражений пройдено при вычислении выражения. Порядок оценки (или «порядок обхода») не оказывает никакого влияния, если только некоторые подвыражения не имеют побочных эффектов, которые влияют на результат (или побочные эффекты) других подвыражений.

Например, если изначально x == 1, выражение ++x/++x будет оцениваться как 2/3 (что соответствует 0), поскольку Java имеет порядок оценки слева направо. Если бы порядок вычисления в Java был справа налево, x был бы увеличен дважды до вычисления числителя, а выражение было бы оценено как 3/2 (что оценивается как 1). Если бы порядок оценки был неопределенным, выражение могло бы вычисляться для любого из этих результатов.

Цитируемая цитата вместе с ее контекстом ...

Язык программирования Java гарантирует, что операнды операторы оцениваются в определенном порядке оценки, а именно слева направо.

Рекомендуется, чтобы код не зависел от этой спецификации. Код обычно более понятен, если каждое выражение содержит не более одной стороны эффект, как его внешняя операция

... отговаривает читателя от зависимости слева направо порядка оценки Java (как в примере выше). Это не поощряет ненужные скобки.

Редактировать: Ресурс: Таблица приоритетов Java-оператора , которая также служит индексом для разделов JLS, содержащих синтаксическую грамматику, из которой выводится каждый уровень приоритета.

2 голосов
/ 01 января 2013

JLS не дает явной таблицы приоритетов операторов; это подразумевается, когда JLS описывает различные операторы. Например, грамматика для ShiftExpression такова:

ShiftExpression:
    AdditiveExpression
    ShiftExpression << AdditiveExpression
    ShiftExpression >> AdditiveExpression
    ShiftExpression >>> AdditiveExpression

Это означает, что аддитивные операторы (+ и -) имеют более высокий приоритет, чем левоассоциативные операторы сдвига (<<, >> и >>>).

2 голосов
/ 24 ноября 2012

Кроме того, не забывайте логические && и || являются операторами быстрого вызова, избегайте чего-то вроде:

sideeffect1() || sideeffect2()

Если sideeffect1 () оценивается как true, sideeffect2 () не будет выполняться. То же самое касается && и false. Это не совсем связано с приоритетностью, но в этих крайних случаях ассоциативность также может быть важным аспектом, который обычно действительно не имеет значения (по крайней мере, насколько я понимаю)

1 голос
/ 13 октября 2012

Мне кажется, что правда в том, что «большинство программистов» думают, что «большинство других программистов» не знают или не могут вспомнить приоритет операторов, поэтому они потворствуют тому, что снисходительно называют «защитным программированием» вставляя пропущенные скобки », просто чтобы« уточнить »это. Является ли запоминание этого материала третьего класса реальной проблемой - это другой вопрос. Также можно утверждать, что все это пустая трата времени и, если что-то, ухудшает ситуацию. Я считаю, что по возможности следует избегать избыточного синтаксиса, и что программисты должны знать язык, на котором они программируют, а также, возможно, повышать свои ожидания от своих коллег.

...