Тема 3. Операторы в Java - BelyiZ/JavaCourses GitHub Wiki

Содержание:

  1. Арифметические операторы
  2. Битовые операторы
  3. Операторы сравнения
  4. Логические операторы
  5. Операторы присваивания
  6. Оператор instanceOf
  7. Условный (тернарный) оператор
  8. Список литературы/курсов

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

Все операторы в Java, а их больше сорока, можно разбить на группы:

  • арифметические,
  • битовые,
  • операторы сравнения,
  • логические,
  • операторы присваивания
  • отдельностоящие instanceOf и тернарный (условный) оператор.

Арифметические операторы

Арифметические операторы используются для осуществления привычных нам арифметических вычислений: сложение, вычитание, умножение, деление и др.

Ниже в таблице приведен список всех арифметических операторов:

Оператор Описание Пример
+ Инфиксный оператор сложения. Складывает левый и правый аргументы. С типом String используется для конкатенации int a = 13 + 271;
- Инфиксный оператор вычитания. Вычитает из левого аргумента правый int a = 271 - 103;
/ Инфиксный оператор деления. Делит левый аргумент на правый. При работе с целочисленными типами остаток от деления отбрасывается int a = 80 / 11; // = 7
* Инфиксный оператор умножения. Умножает левый аргумент на правый int a = 2 * 2; // = 4 :)
% Инфиксный оператор получения остатка от деления. Делит левый аргумент на правый и возвращает остаток от деления int a = 15 % 11; // = 4
++ Унарный оператор инкремента. Увеличивает значение аргумента на единицу int a = 11; a++;
-- Унарный оператор декремента. Уменьшает значение аргумента на единицу int a = 11; a--;

Пример работы с арифметическими операторами:

int a = 123;
int b = a + 15;
int c = a + b;
c++;
b = a--;
int d = ((a + 2) / (b - 18)) * 13 % 12;

String e = "strings";
String f = "concatenation";
String g = "This is a " + e + " " + f;

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

Рассмотрим это подробнее на примере:

int a = 1;
int b = 4;

int c = a++ + b;

После выполнения этого кода значения переменных будут следующие: a - 2, b - 4, c - 5. При инициализации переменной "с", сначала мы берем значение переменной "а" и прибавляем к нему значение переменной "b". И только потом значение "а" будет увеличено на единицу.

Попробуем поставить оператор "++" перед переменной "а". Теперь после выполнения кода значений будут такие: a - 2, b - 4, c - 6. Так как мы сначала увеличили значение "а" на единицу, а уже потом использовали его в сложении с "b".

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

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

Оператор Описание Пример
== Проверяет равенство аргументов. Если операнды равны, возвращает true. Для ссылочных типов проверяет лишь равенство ссылок, а не значений. Для сравнения значений необходимо использовать метод equals() (мы обсудим это в одной из следующих тем) boolean a = 15 == 13; // false
!= Проверяет неравенство аргументов. Если операнды НЕ равны, возвращает true. Для ссылочных типов проверяет неравенство ссылок, для проверки значений нужно использовать метод equals() (мы обсудим это в одной из следующих тем) boolean a = 15 != 13; // true
> Возвращает true, если левый аргумент больше правого по значению. Работает только с числами boolean a = 80 > 11; // = true
>= Возвращает true, если левый аргумент больше или равен правому по значению. Работает только с числами boolean a = 2 >= 2; // = true :)
< Возвращает true, если левый аргумент меньше правого по значению. Работает только с числами boolean a = 15 < 11; // = false
<= Возвращает true, если левый аргумент меньше или равен правому по значению. Работает только с числами boolean a = 11 <= 3; // false

Пример работы с операторами сравнения:

int a = 123;
int b = 324;
boolean b = a == 15; // false
boolean c = a > 123; // false
boolean d = a >= 123; // true
boolean e = a != b; // true
boolean f = b < a; // false
boolean g = a <= b; // true

Наиболее часто такие операторы применяются совместно с условным оператором if. Об этом мы поговорим в следующей теме.

Логические операторы

Логические операторы работают только с boolean данными, в результате выполнения возвращается тот же тип.

Оператор Описание Пример
&& Инфиксный дизъюнктор (оператор «И»). Если оба операнда истинны (т.е. == true), возвращает true. Следует отметить, что если выражение в левой части ложно, то правый аргумент уже не будет обрабатываться и проигнорируется boolean a = (15 < 13) && (3 == 3); // false
ǀǀ Инфиксный конъюнктор (оператор «ИЛИ»). Если хотя бы один из операндов истинен (т.е. == true), возвращает true. Следует отметить, что если выражение в левой части истинно, то правый аргумент уже не будет обрабатываться и проигнорируется boolean a = (15 < 13) ǀǀ (3 == 3); // true
! Унарный оператор инверсии. Меняет истину на ложь и наоборот boolean a = !false; // = true

Примеры:

int a = 123;
int b = 324;
boolean b = a == 123 && b > 300; // true
boolean c = a > 100 && false; // false
boolean d = true || false; // true
boolean e = false || true; // true
boolean f = !e; // false
boolean g = !!d; // true

При работе с boolean данными операторы "&" и "|" выступают в качестве логических, а не битовых. Главное их отличие от "&&" и "||" в том, что они всегда выполняют и левое, и правое выражение, независимо от их значений.

Битовые операторы

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

Оператор Описание Пример
& Инфиксный оператор AND int a = 123 & 65;
ǀ Бинарный оператор OR int a = 123 ǀ 65;
^ Инфиксный оператор XOR int a = 123 ^ 65;
~ Префиксный оператор побитового дополнения int a = ~65;
<< Инфиксный оператор арифметического сдвига влево int a = 123 << 2;
>> Инфиксный оператор арифметического сдвига вправо int a = 123 >> 3;
>>> Инфиксный оператор нулевого сдвига вправо int a = 123 >>> 1;

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

Для указания значения переменной или константы используются операторы присваивания. Частично мы их рассматривали в предыдущей теме. Сейчас изучим другие возможности.

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

Помимо основного оператора присваивания "=", есть и короткие записи для арифметических и побитовых операций. Их можно использовать когда перед присваиванием нужно получить текущее значение переменной и выполнить с ним какое-то действие. Например, мы хотим увеличить значение целочисленной переменной на 10. Мы можем сделать это так:

int a = 135;
a = a + 10;

Вторую строку можно укоротить, если использовать специальный оператор присваивания "+=". И код будет выглядеть так:

int a = 135;
a += 10;

В данном случае оператор присваивания сначала выполнит сложение "a + 10" и только потом присвоит полученный результат переменной "a".

Аналогичные операторы есть и для других случаев:

Оператор Пример Аналог
+= a += 1; a = a + 1; a++;
-= a -= 3; a = a - 3;
*= a *= 2; a = a * 2;
/= a /= 4 a = a / 4;
%= a %= 5; a = a % 5;
<<= a <<= 6 a = a << 6;
> > = a >>= 7 a = a >> 7;
&= a &= 8 a = a & 8;
^= a ^= 9 a = a ^ 9;
ǀ= a ǀ= 10 a = a ǀ 10;

Оператор instanceOf

Ключевое слово instanceOf используется для проверки отношения объекта к определенному классу. Подробнее об этом мы будем говорить в блоке про ООП.

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

Этот оператор заметно отличается от всех рассмотренных. Во-первых, это тернарный оператор, то есть он работает с тремя аргументами. Во-вторых, он уже ближе к управлению логикой приложения (Control Flow).

Основная задача условного оператора - выбор одного из двух выражений, опираясь на результат выполнения третьего. Схематично он выглядит так: операнд1 ? операнд2 : операнд3, где операнд1 - переменная boolean или выражение, возвращающее этот тип; операнд2 выполняется, если операнд1 == true; операнд3 выполняется, если операнд1 == false.

Примеры:

String a = 4 > 6 ? "Истина" : "Ложь"; //Ложь
int b = "Ложь".equals(a) ? 1 : 0; // 1
long c = b == 1 ? b + 4 : b - 4; // 5

Список литературы/курсов

  1. http://proglang.su/java/operators
  2. https://javarush.ru/groups/posts/operatory-java-logicheskie-arifmeticheskie-pobitovye

Тема 2. Типы данных в Java|Оглавление|Тема 4. Управляющая логика