Главная » Java » Приоритеты и ассоциативность операторов Java

0

 

О приоритеmax операторов можно говорить как о способности их к взаимному "склеиванию". Операторы обладают разными приоритетами. Операторы сравнения, например, имеют более высокий приоритет, нежели булевы логические операторы, и поэтому выражение

if (min <= i && i <= max)

process(i);

 

Интерпретируется совершенно однозначно и не требует дополнительных разъяснений. Поскольку оператор * (умножение) обладает более высоким приоритетом в Сравнении с оператором – (вычитание), в результате вычисления выражения

3 – 3 * 5

 

Будет Получено значение -12, а не О. Приоритеты могут быть переопределены с помощью круглых скобок; если бы, скажем, в предыдущем выражении нас больше интересовал нулевой результат, мы написали бы так:

 (3 – 3) * 5

Если два оператора с одинаковым приоритетом соседствуют в пределах Выражения, порядок их вычисления определяется свойством ассоциативности. Поскольку операция сложения (+) является левоассоциативной, выражение

а + b + с

равнозначно следующему: (а + b) + с

Ниже приведена таблица, перечисляющая все операторы Java в Порядке уменьшения их приоритетов. Все операторы бинарны, за исключением унарных, отмеченных словом expr, операторов создания объектов и явного преобразования типов (которые также являются унарными) и тернарного условного оператора. Операторы, обладающие одинаковым приоритетом, указаны в пределах одной строки.

 

Операторы сложения и вычитания

+ –

Операторы побитового сдвига

<< >> >>>

Операторы сравнения

< > >= <= instanceof

Операторы равенства и неравенства

== !=

И (AND)

&

Исключающее ИЛИ (XOR)

^

Включающее ИЛИ (OR)

I

Условное И (AND)

&&

Условное ИЛИ (OR)

I I

Условный оператор

?:

Операторы присваивания

= += -= *= /= %= >>= <<= >>>= &= ^= |=

 

 

 

 

Все бинарные операторы, за исключением операторов присваивания, левоассоциативны. Операторы присваивания правоассоциативны. Другими словами, а=b=с равнозначно а=(b=с), что позволяет объединять операции присваивания в цепочку. Условный оператор ?:, правоассоциативен.

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

while ((v = stream.next()) != null)

 processValue(v);

операторы присваивания имеют более низкий приоритет, чем оператор неравенс1’ва; при отсутствии скобок выражение было бы равноценно следующему:

while (v = (stream.next() != null)) // НЕВЕРНО!

processValue(v);

Это наверняка не то, что отвечает вашему замыслу. Кроме того, этот код, вероятнее всего, просто неверен, поскольку формально правильным он может оказаться только в том довольно экзотическом случае, когда v относится к типу boolean.

Многие жалуются на то, что приоритеты побитовых и логических операторов &, ^ и I трудно запомнить. В сложных выражениях эти операторы с соответствующими аргументами лучше заключать в скобки, чтобы сделать код удобочитаемым и избежать возможных ошибок.

Схема приоритетов операторов – это часть языка, и ее изучению необходимо

уделить определенное внимание. У нас нет строгой системы применения скобок – мы прибегаем к их помощи только тогда, когда код становится слишком запутанным. Некоторые лентяи вообще не расставляют скобок. Попробуйте-ка убрать скобки вовсе – и ваш код станет похож на "китайскую грамоту".

Упражнение 6.2. Воспользуйтесь знаниями, полученными при изучении этой главы, и попробуйте определить, не создавая программный код и не проверяя его на компьютере, какие из приведенных ниже выражений неправильны; укажите типы правильных выражений и значения, возвращаемые ими:

3 << 2L – 1

(3L « 2) – 1

10 < 12 == 6 > 17

 10 << 12 == 6 >> 17

13.5е-1 % Float.POSITIVE_INFINITY

Float.POSITIVE_INFINITY + Double.NEGATIVE_INFINITY

Double.POSITIVE_INFINITY – Float.NEGATIVE_INFINITY

0.0 / -0.0 == -0.0 / 0.0

Integer.MAX_VALUE + Integer.MIN_VALUE

Long.MAX_VALUE + 5

(short) 5 * (byte) 10

(i < 15 7 1.72e3f : 0)

i++ + i++ + –; // Вначале i = 3

 

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии