Операторы

Базовый Java
≈ 5 мин чтения

Операторы — действия над значениями

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

int price = 120;
int count = 3;
int total = price * count;

System.out.println(total); // 360

Здесь * берёт два значения и вычисляет их произведение. Результат выражения price * count затем сохраняется в total.

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

Для обычных вычислений используются +, -, *, / и %. Последний оператор возвращает остаток от деления.

int sum = 8 + 3;        // 11
int difference = 8 - 3; // 5
int product = 8 * 3;    // 24
int quotient = 8 / 3;   // 2
int remainder = 8 % 3;  // 2

Типы операндов влияют на результат. Если оба числа целые, результат деления тоже будет целым: дробная часть просто отбрасывается. Чтобы получить дробный результат, хотя бы один операнд должен быть вещественным.

double result = 8.0 / 3;
System.out.println(result); // 2.6666666666666665
Деление целых чисел не округляет результат. Выражение 8 / 3 даёт 2, а не 3.

Присваивание и изменение значения

Оператор = присваивает переменной значение. Если нужно изменить уже существующее значение, часто удобнее использовать составные операторы присваивания: +=, -=, *=, /= и %=.

int score = 10;

score += 5;
score *= 2;

System.out.println(score); // 30

Для увеличения или уменьшения числа на единицу есть операторы ++ и --. Если такой оператор используется отдельной командой, префиксная и постфиксная формы дают одинаковый итог.

int attempts = 3;

attempts++;
--attempts;

Разница появляется, когда результат операции сразу участвует в другом выражении. Префиксная форма сначала меняет значение, а затем возвращает его; постфиксная сначала возвращает старое значение, а затем меняет переменную.

int value = 5;

int first = ++value;
int second = value++;

System.out.println(first);  // 6
System.out.println(second); // 6
System.out.println(value);  // 7
Не усложняй выражения с ++ и --. Отдельная строка вроде count++; обычно читается намного легче, чем несколько изменений внутри одного выражения.

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

Сравнение не меняет значения — оно отвечает на вопрос и возвращает boolean: true или false.

int temperature = 20;

boolean warm = temperature > 15;
boolean exact = temperature == 20;
boolean different = temperature != 10;

Для сравнения используются <, <=, >, >=, == и !=.

= и == делают разные вещи. Один знак присваивает значение, два знака сравнивают значения.

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

Логические операторы работают с boolean и позволяют объединять несколько проверок. && означает «и», || — «или», а ! меняет логическое значение на противоположное.

boolean hasTicket = true;
boolean hasDocument = false;

boolean canEnter = hasTicket && hasDocument;
boolean hasSomething = hasTicket || hasDocument;
boolean noTicket = !hasTicket;

У && и || есть важное свойство — короткое замыкание. Java вычисляет правую часть только тогда, когда она ещё может повлиять на результат всего выражения.

int value = 10;
int divisor = 0;

boolean largeResult = divisor != 0 && value / divisor > 2;

Здесь после divisor != 0 уже понятно, что всё выражение с && ложно, поэтому деление на ноль даже не выполняется.

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

Целые числа можно рассматривать как набор битов и работать с ними напрямую. Для этого есть &, |, ^ и ~, а также сдвиги <<, >> и >>>.

int flags = 0b0101;
int mask = 0b0001;

int selected = flags & mask; // 0b0001
int shifted = flags << 1;   // 0b1010

& оставляет единицу только там, где единица есть в обоих операндах, а << сдвигает биты влево. Оператор >> при сдвиге вправо сохраняет знак числа, а >>> заполняет освободившиеся старшие биты нулями. В обычном прикладном коде такие операции встречаются заметно реже арифметических и логических, но читать их нужно уметь.

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

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

boolean premium = true;
int fee = premium ? 0 : 100;

Сначала вычисляется выражение до ?. Если оно равно true, результатом становится значение после ?; если false — значение после :.

Приоритет операторов

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

int first = 2 + 3 * 4;   // 14
int second = (2 + 3) * 4; // 20

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