Операторы
Операторы — действия над значениями
Переменные хранят значения, а операторы позволяют что-то с этими значениями делать: складывать числа, сравнивать их, менять значение переменной или объединять несколько проверок. Из значений и операторов получаются выражения — фрагменты кода, которые вычисляют новый результат.
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
Запоминать всю таблицу приоритетов наизусть не нужно. Для очевидных выражений достаточно помнить базовые правила, а если порядок может вызвать сомнение — используй скобки. Они одновременно задают нужный порядок вычислений и делают намерение кода заметнее.