Приоритет операций — Java программирование

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

В следующей таблице представлены операции Java языка. Операции, находящиеся в одном ряду таблицы, имеют одинаковый приоритет. Операции в каждой последующей строке ниже по приоритету:

[]().    
++~!
+(унарная)
— (унарная)(приведение типов)
*/%    
+     
>>>>><<    
>>=<<=instanceof  
==!=     
&      

^

 

 

 

 

 

 

|      
&&      
||      
? :      
->      
=      

Круглые скобки повышают приоритет заключенных в них операций. Их можно использовать с целью упростить понимание смысла выражения.

Применение круглых скобок (избыточных или нет) не ведет к снижению производительности программы.

Равнозначные выражения:

а | 4 + с >> b & 7
(a | (((4 + c) >> b) & 7))

Презентацию с видео можно скачать на Patreon.

Previous

Next

Read also:

  • Арифметические операторы
  • Инкремент и декремент
  • Операторы сравнения
  • Логические операторы
  • Тернарный оператор
  • Оператор присваивания
  • Конкатенация строк
  • Побитовые операции
  • Задания

Trustpilot

Trustpilot

Курс Java Multithreading — Лекция: Приоритет операторов

— Привет, Билаабо!

— Билаабо рад приветствовать друга!

Билаабо сегодня расскажет о приоритете операторов. Но сначала он расскажет о самих операторах.

— А что это такое – эти операторы?

На самом деле ты уже знаком с ними, просто, возможно, не знал, что это – операторы.

Вот, например, есть выражение c = a + b;

Тут есть два оператора: оператор сложения и оператор присваивания.

— Т.е. операторы – это просто математические знаки? Как умножение, деление и сложение?

— Ага, так и есть. Хотя есть и отличия.

Я не буду давать определение операторов: от этого ты умнее не станешь. Лучше посмотрим их на деле. Операторы можно разбить на несколько групп, и мы сейчас их рассмотрим.

1) Группа «математические операторы»

ОбозначениеПримерНазваниеОписание (что делает)
+a + bОператор сложенияСкладывает два числа.
-c - dОператор вычитания
Вычитает второе число из первого.
*a * tОператор умноженияУмножает два числа.
/a / bОператор деленияДелит первое число на второе.
%c % dОстаток от деленияВычисляет остаток от деления первого числа на второе.
--aОдинарный минус
Меняет знак переменой на обратный.
Плюс на минус, минус на плюс.
++aОдинарный плюсНичего не меняет. Добавлен вместе с одинарным минусом для красоты.

— Это я и со школы знаю – мне залили школьный курс вместе с прошивкой.

А что это еще за процент такой волшебный?

— Это «остаток от деления». Если 11 делить нацело на 5, то получим 2 и остаток от деления – 1. Вот этот 1 и можно получить, если записать 11 % 5;

При делении целых чисел в Java результат тоже будет целым числом. Остаток от деления просто отбрасывается. Если разделить 8 на 5, то получим 1.

ВыражениеОтвет
19 / 101Если делить нацело 19 на 10, получим 1 и 9 в остатке.
19 % 109Если делить нацело 19 на 10, получим 1 и 9 в остатке.
2 / 50Если делить нацело 2 на 5, получим 0 и 2 в остатке.
16 % 20Если делить нацело 16 на 2, получим 8 и 0 в остатке.

— А зачем вообще нужен этот остаток от деления?

— Допустим тебе нужно проверить – четное число а или нет, тогда это можно записать так

if (a % 2 == 0)

А если нужно проверить, что b – нечетное, тогда это можно записать так

if (b % 2 == 1)

Или, например, делится ли d нацело на 3:

if (d % 3 == 0)

— Интересно, я это запомню.

2) Группа «операторы сравнения»

ОбозначениеПримерНазваниеОписание (что делает)
<a < bМеньшеПроверяет, что a меньше b.
<=c <= dМеньше или равноПроверяет, что c меньше или равно d.
>a > bБольшеПроверяет, что a больше b.
>=c >= dБольше или равноПроверяет, что c больше или равно d.
==i == jРавноПроверяет, что i равно j.
!=a != 0НеравноПроверяет, что a неравно нулю.

— Я этим всем уже пользовался.

— И какое же главное отличие этих операторов от математических операторов?

— Если мы складываем два числа, то получаем число, а если сравниваем два числа – получаем true или false.

— Верно. Результатом сравнения будет «логическое значение» или попросту одно значение из пары (true, false), которые, как ты знаешь, являются значениями типа boolean.

— Да, тут все понятно, я это уже знаю.

3) Группа «логические операторы»

Обозначение
ПримерНазваниеОписание (что делает)
&&a && bAND – «и»Результат выражения true, только когда и a и b равны true.
||c || dOR – «или»Результат выражения true, если a или b равно true. Оба или хотя бы один.
!!aNOT – «не»Результат выражения true, только если a равно false.

— Логические операторы можно применять только к переменным или выражениям логического типа.

ПримерОписание
boolean a = true;
boolean b = true;if (a && b)
Условие if истинно (true), если оба значения истинны.
Т.е. если  a и b равны true, то результат – true.
boolean a = true;
boolean b = false;if (a || b)
Условие if истинно (true), если хотя бы одно значение — истина.
Т.е. если  a или b равны true, то результат – true.
boolean b = false;

if (!b)

Условие if истинно (true), если b — не истина.
Т. е. если  b равно false, то результат – true.
int a = 2, b = 3, c = 4;

if (a < b && a < c)
эквивалентно
if ((a < b) && (a < c))

Если a меньше b и a меньше c, то результат выражения – истина.
a,b,c – целые числа, но результат сравнения целых чисел – это уже логическое значение (true, false) а значит мы можем использовать логические операторы.

— Все это я и так знаю.

— Да? Тогда продолжим.

4) Группа – «побитовые операторы»

ОбозначениеПримерНазваниеОписание (что делает)
&a & bAND – «и»Побитовое «И»
|c | dOR – «или»Побитовое «ИЛИ»
~~aNOT – «не»Побитовое «НЕ»
^a ^ bXOR – «исключающее или»Побитовое «ИСКЛЮЧАЮЩЕЕ ИЛИ»

— Побитовые операторы выполняют операцию над целыми числами побитово.

— Это как?

— Каждое число представляется в виде набора бит, а затем вычисляется результат по такой схеме:

Если первый бит в обоих числах равен 1, то первый бит результата будет 1.

Если второй бит в обоих числах равен 1, то второй бит результата будет 1. И так далее

— Это верно для всех побитовых операторов?

— Тут все намного проще. Бит может принимать только два значения – 0 и 1, так?

— Да.

— Тогда представь, что 1 – это true, а 0 – это false. Тогда операции над отдельными битами будут практически такими же, как и логические операции:

Логическое выражениеБитовое выражение
true && true == true1&1 == 1
true && false == false1&0 == 0
true || true == true1|1 == 1
true || false == true1|0 == 1
false || false = false0|0 == 0
!false == true~0 == 1
!true == false~1 == 0

— О! Так все же очень просто. 000010010000110012~9~0000100111110110246

— Спасибо, Билаабо. Буду знать.

— Есть еще одна группа побитовых операторов – операторы сдвига:

5) Группа «операторы сдвига»

ОбозначениеПримерНазваниеОписание (что делает)
>>a >> bсдвиг вправоСдвигает биты числа a, на b разрядов вправо.
<<c << dсдвиг влевоСдвигает биты числа c, на d разрядов влево.
>>>a >>> 2сдвиг вправо с заполнением нулемСдвигает биты числа a, на 2 разряда вправо.

— Это что еще за уличная магия?

— На самом деле тут все просто. Вот смотри:

ПримерЧисла в битовом видеОтвет в битовом видеОтвет
10 >> 100001010 >> 1000001015
10 >> 200001010 >> 2000000102
10 << 100001010 << 10001010020
10 << 200001010 << 20010100040

Сдвига разрядов числа на 1 влево – то же самое, что умножить число на 2. На два разряда равно умножению на 4, на три разряда – умножению на 8 и так далее.

Сдвиг вправо – соответственно, деление на 2,4,8,16,… и так далее.

— А в чем отличие операторов «>>>» и «>>»?

— Они отличаются при работе с отрицательными числами. Дело в том, что знак отрицательного числа хранится в крайнем левом бите. И при сдвиге вправо число перестает быть отрицательным. Поэтому и придумали два различных оператора, вот смотри:

ВыражениеРезультатОписание
10001010 >> 111000101Отрицательное число остается отрицательным.
Новые разряды заполняются 1, для отрицательных чисел.
10001010 >> 211100010
10001010 >> 311110001
10001010 >>> 101000101Отрицательное число перестает быть отрицательным. Новые разряды заполняются 0, для отрицательных чисел.
10001010 >>> 200100010
10001010 >>> 300010001

Сдвиг не циклический. Биты, которые оказались за краем числа слева или справа, просто отбрасываются.

6) Группа «операторы присваивания»

— Присваивание я уже знаю. А почему ты говоришь операторы?

— Потому что их несколько ☺

ОператорЧто он значит
a += b;a = a + b;
a -= b;a = a - b;
a *= b;a = a * b;
a %= b;a = a % b;
a |= b;a = a | b;
a &= b;a = a & b;

Думаю, логика тебе ясна.

7) Группа «операторы инкремента и декремента»

ЗаписьПримерОписание
++a++;
++b;
Увеличивает число на 1.
--d--;
--i;
Уменьшает число/переменную на 1.

— А в чем отличие, когда два минуса спереди или сзади?

— А отличие есть. Хоть и не очень большое. Если переменная с таким оператором участвует в каком-нибудь выражении или присваивании, то тут возникают различия. Давай я лучше покажу тебе на примере:

ПримерЧто происходит на самом делеОписание
int a = 3;
int b = ++a;
int a = 3;
a = a + 1;
int b = a;
а сначала увеличивается на 1, затем участвует в выражении.
int a = 3;
int b = a++;
int a = 3;
int b = a;
a = a + 1;
а сначала участвует в выражении, затем увеличивается на 1.
int a = 3;
return a++;
int a = 3;
int result = a;
a = a + 1;
return result;
функция вернет 3, но значение a будет увеличено на 1.
int x = 5;
x = ++x + ++x;
int x = 5;
int a = x + 1;//первое слагаемое 6
x = a;
int b = x + 1;//второе слагаемое 7
x = b;
x = a + b;
тут будет ответ 13. Сначала x увеличится на 1, и это значение подставится на место первого слагаемого, а потом х увеличится еще раз на 1.

— Ничего себе! Вот это круто!

— Рад, что тебе понравилось. Но, если нет никакого выражения или присваивания, то никаких отличий нет:

Просто «x++» эквивалентно x = x + 1.

Просто «++x» тоже эквивалентно x = x + 1.

— Буду знать, спасибо, Билаабо.

8) Группа «тернарный оператор»

— В этом операторе участвуют не одна переменная/выражение и не две, а сразу три:

Вот как он записываетсяА вот чему он эквивалентен:
a ? b : c;if (a)
b
else
c
int min = a < b ? a : b;if (a < b)
min = a;
else
min = b;
return a != null ? a. length : 0;if (a != null)
return a.length;
else
return 0;

— Так это же очень удобная штука.

— Ага. И компактно и код читабельный. Пользуйся на здоровье.

9) Группа «остальное»

— Сколько музыку ни разбирай, а папку «разное» создать придется.

— Да, каждый, кто хоть раз это делал, полностью с тобой согласен.

— Так вот, есть еще три оператора, о которых я хотел тебе рассказать:

ЗаписьПримерОписание
()(a + b) * cСкобки повышают приоритет выполнения.
Сначала выполняется то, что в скобках.
[]c [i] = c [i + 1];Получение элемента массива по индексу.
.int n = a.length;«оператор точка» – получение переменных и методов у объекта.

И, наконец, приоритет операторов и порядок их выполнения:

ОператорыПримеры
Высший приоритет (сначала выполняются операторы расположенные выше в таблице)
()
[]
.
(a + b)
c [i] = c [i] + 1
++
--
~
!
+
-
i++; ++i;
--j; a--;
~c
!f
return +a;
return -a;
*
/
%
a * b
c / d
a % b
+
-
a + b
c - d
String s = "count"+"35 ";
>>
<<
>>>
a >> 3
b << 2
c >>> 3
<
<=
>
>=
a < b
a <= b
c > b
c >= b
==
!=
a == 3
a != 0
&a & 7
^a ^ b
|a | b
&&(a < b) && (a < c)
||(b != 0) || (c != 0)
? : =a > 0 ? a : -a;
=
*=, /=, %=
-=, +=
<<=. =. |=
Низший приоритет (выполняются в самом конце)

 

Приоритет оператора Java — Javatpoint

следующий → ← предыдущая

В этом разделе мы изучим приоритет оператора в Java вместе с примерами.

Что такое приоритет оператора?

Приоритет оператора показывает, как два выражения связаны друг с другом. В выражении он определяет группировку операторов с операндами и решает, как будет оцениваться выражение.

При решении выражения необходимо помнить о двух вещах. Первая — это число 9.0008 старшинство , а второй ассоциативность .

Приоритет

Приоритет — это приоритет группировки различных типов операторов с их операндами. Это имеет смысл только в том случае, если выражение имеет более одного оператора с более высоким или более низким приоритетом. Сначала оцениваются операторы с более высоким приоритетом. Если мы хотим сначала оценить операторы более низкого приоритета, мы должны сгруппировать операнды с помощью круглых скобок, а затем вычислить.

Ассоциативность

Мы должны следовать ассоциативности, если выражение имеет более двух операторов с одинаковым приоритетом. В таком случае выражение может быть решено либо слева направо , либо справа налево, соответственно.

Таблица приоритетов операторов Java

В следующей таблице описаны приоритеты и ассоциативность операторов, используемых в Java.

Приоритет Оператор Тип Ассоциативность
15 ()
[]
·
Круглые скобки
Нижний индекс массива
Выбор элемента
Слева направо
14++
Унарный постинкремент
Унарный постдекремент
Справа налево
13 ++

+

!
~
(тип)
Унарный преинкремент
Унарный преинкремент
Унарный плюс
Унарный минус
Унарный логический отрицание
Унарное побитовое дополнение
Унарное приведение типа
Справа налево
12 *
/
%
Умножение
Деление
Модуль
Слева направо
11 +
Сложение
Вычитание
Слева направо
10 <<
>>
>>>
Побитовый сдвиг влево
Побитовый сдвиг вправо с расширением знака
Побитовый сдвиг вправо с нулевым расширением
Слева направо
9 <
<=
>
>=
экземпляр
Относительный меньше
Относительный меньше или равен
Относительный больше
Относительный больше или равен
Сравнение типов (только объекты)
Слева направо
8 ==
!=
Реляционное равно
Реляционное не равно 9
Побитовое исключающее ИЛИ Слева направо
5 | Побитовое включительно ИЛИ Слева направо
4 && Логическое И Слева направо
3 || Логическое ИЛИ Слева направо
2 ? : Тернарное условное Справа налево
1 =
+=
-=
*=
/=
%=
Назначение
Назначение сложения
Назначение вычитания
Назначение умножения
Назначение деления
Назначение модуля
Справа налево
Примечание.
Чем больше номер, тем выше приоритет.

Пример приоритета оператора Java

Давайте разберемся с приоритетом оператора на примере. Рассмотрите следующее выражение и угадайте ответ.

1 + 5 * 3

Вы можете подумать, что ответ будет 18 , но это не так. Потому что оператор умножения (*) имеет более высокий приоритет, чем оператор сложения (+). Следовательно, выражение сначала оценивает 5 * 3, а затем оценивает оставшееся выражение, т. Е. 1 + 15. Следовательно, ответ будет 16 .

Давайте посмотрим на другой пример. Рассмотрим следующее выражение.

х + у * г / к

В приведенном выше выражении операции * и / выполняются перед + из-за приоритета. y умножается на z перед делением на k из-за ассоциативности.


Next TopicPrivate Constructor в Java

← предыдущая следующий →

Приоритет операторов и ассоциативность в Java

  • Типы операторов Java
  • Порядок оценки выражения
  • Приоритет и ассоциативность
  • Ссылки

Типы операторов Java

Оператор Java — это специальный символ, который выполняет определенную операцию с одним, двумя или тремя операндами в зависимости от типа оператора и возвращает результат.

Java предоставляет богатый набор операторов, которые классифицируются по двум основаниям. Во-первых, на основе количества операндов, над которыми работает оператор. Во-вторых, от типа или характера операции, которую выполняет оператор.

По первой классификации операторы Java могут быть унарными , двоичными или троичными . Унарные операторы работают с одним операндом, например, ++ и -- . Бинарные операторы оператор на два операнда. Все арифметические операторы являются примерами бинарных операторов. В-третьих, оператор специального типа — тернарный оператор. Тернарный оператор работает с тремя операндами. В Java есть только один тернарный оператор, который также называется 9.0300 условный оператор . Это комбинация двух символов ? и : .

Другая классификация основана на типе операции, которую они выполняют. В зависимости от типа операции операторов можно разделить на следующие категории:

  1. Арифметические операторы
  2. Операторы увеличения и уменьшения
  3. Побитовые операторы
  4. Реляционные операторы
  5. Логические операторы
  6. Операторы присваивания
  7. Разные операторы

Порядок оценки выражения

В Java, когда вычисляется выражение, в выражение может быть вовлечено более одного оператора. Когда в выражении необходимо оценить более одного оператора, интерпретатор Java должен решить, какой оператор должен быть оценен первым. Java принимает это решение на основе приоритета и ассоциативности операторов.

Приоритет и ассоциативность операторов Java

Операторы Java имеют два свойства: приоритет и ассоциативность . Приоритет — это порядок приоритета оператора, если в выражении два или более операторов, то сначала будет выполняться оператор с наивысшим приоритетом, затем выше, а затем высокий. Например, в выражении 1 + 2 * 5 сначала будет обработан оператор умножения (*), а затем сложения. Это потому, что умножение имеет более высокий приоритет или приоритет, чем сложение.

В качестве альтернативы вы можете сказать, что когда операнд используется двумя операторами (2 в приведенном выше примере используется совместно + и *), тогда оператор с более высоким приоритетом выбирает общий операнд для обработки. Из приведенного выше примера вы бы поняли роль старшинства или приоритета в выполнении операторов. Но ситуация не всегда может быть такой простой, как показано в приведенном выше примере. Что, если все операторы в выражении имеют одинаковый приоритет? В этом случае в игру вступает второе свойство, связанное с оператором, которое равно 9.0300 ассоциативность . Ассоциативность указывает направление выполнения операторов, которое может быть слева направо или справа налево . Например, в выражении a = b = c = 8 оператор присваивания выполняется справа налево, что означает, что c будет присвоено значение 8, затем b будет присвоено значение c, и, наконец, a будет присвоено значение b. Вы можете заключить это выражение в скобки как (a = (b = (c = 8))) .

Обратите внимание, что вы можете изменить приоритет оператора Java, заключив в круглые скобки оператор более низкого приоритета, но не ассоциативность. Например, в выражении (1 + 2) * 3 сложение будет выполнено первым, потому что круглые скобки имеют более высокий приоритет, чем оператор умножения.

Прежде чем обсуждать отдельные классы операторов, в таблице ниже представлены все операторы Java от самого высокого до самого низкого приоритета, а также их ассоциативность.

9
Таблица 1: Операторы Java — диаграмма приоритета от высшего к низшему
Приоритет Оператор Описание Ассоциативность
1 []
()
.
индекс массива
вызов метода
доступ к члену
Влево -> Вправо
2 ++

+ —
~
!
приращение до или после фиксации
пред- или постфиксный декремент
унарный плюс, минус
побитовое НЕ
логическое НЕ
Вправо -> Влево
3 (тип литой)
новый
тип отливки
создание объекта
Вправо -> Влево
4 *
/
%
умножение
деление
модуль (остаток)
Влево -> Вправо
5 + —
+
сложение, вычитание
конкатенация строк
Влево -> Вправо
6 <<
>>
>>>
левая смена
подписанный правый сдвиг
сдвиг вправо без знака или с нулевым заполнением
Влево -> Вправо
7 <
<=
>
>=
случай
меньше
меньше или равно
больше
больше или равно
эталонный тест
Влево -> Вправо
8 ==
«=»
равно
не равно
Влево -> Вправо
9 и
побитовое И Влево -> Вправо побитовое исключающее ИЛИ Влево -> Вправо
11 | побитовое ИЛИ Влево -> Вправо
12 && логическое И Влево -> Вправо
13 || логическое ИЛИ Влево -> Вправо
14 ? : условное (троичное) 9=
|=
<<=
>=
>>>=
операторы присваивания и сокращенные операторы присваивания Вправо -> Влево

Последнее слово

В этом руководстве мы говорили о приоритете и ассоциативности операторов Java.