Тема 3. Операторы в Java - BelyiZ/JavaCourses GitHub Wiki
Содержание:
- Арифметические операторы
- Битовые операторы
- Операторы сравнения
- Логические операторы
- Операторы присваивания
- Оператор instanceOf
- Условный (тернарный) оператор
- Список литературы/курсов
Операторы — это специальные символы (или целые слова), с помощью которых можно выполнять некоторые действия с данными (аргументами). Операторы, работающие с одним аргументом, называются унарными, с двумя - бинарными, а с тремя - тернарными. Те, что нужно писать до операнда, называют префиксными, те, что после - постфиксными, но большинство из них нужно писать между аргументами, их называют инфиксными бинарными операторами.
Все операторы в 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
Список литературы/курсов
- http://proglang.su/java/operators
- https://javarush.ru/groups/posts/operatory-java-logicheskie-arifmeticheskie-pobitovye
Тема 2. Типы данных в Java|Оглавление|Тема 4. Управляющая логика