Операторы
Операторы — это знаки, которые что-то делают со значениями. Три главные группы:
- Арифметические —
+ - * / %(остаток от деления); - Сравнения —
== != < > <= >=(результат всегдаboolean); - Логические —
&& || !(И, ИЛИ, НЕ — для условий).
int sum = 5 + 3; // 8
boolean isAdult = age >= 18;
boolean canVote = isAdult && hasCitizenship; // оба условия сразу
% — остаток от деления, не «процент»: 10 % 3 равно 1 (10 делится на 3 три раза, остаётся 1). Часто используется, чтобы проверить чётность: n % 2 == 0.
Копнуть глубже
Short-circuit (короткое замыкание) у && и ||. Java не проверяет второе условие, если первое уже решило исход:
if (user != null && user.isActive()) { ... }
Если user == null, до user.isActive() дело не дойдёт — иначе была бы NullPointerException. && останавливается на первом false, || — на первом true. Это не просто оптимизация, а защитный приём, на который часто опираются специально.
Инкремент/декремент. ++ и -- имеют две формы:
int i = 5;
i++; // постфикс: использовать старое значение, потом прибавить
++i; // префикс: сначала прибавить, потом использовать
Разница видна только внутри выражения: int a = i++; положит в a старое значение, int b = ++i; — уже новое.
Составное присваивание. x += 5 — то же самое, что x = x + 5, просто короче. Так же работают -= *= /= %=.
Под капотом
Целочисленное деление режет дробную часть, а не округляет:
int result = 7 / 2; // 3, а не 3.5 и не 4
double real = 7.0 / 2; // 3.5 — если хотя бы один операнд double
Чтобы получить дробный результат, хотя бы одно из чисел должно быть double/float — иначе Java честно делит как целые и отбрасывает остаток.
Приоритет операторов — * / % выполняются раньше + -, как в математике. Если сомневаешься — скобки () явно задают порядок и делают код понятнее, даже когда приоритет и так правильный.
Побитовые операторы (& | ^ ~ << >>) работают с битами числа напрямую — встречаются редко, в основном во флагах и низкоуровневой оптимизации. На старте достаточно знать, что они существуют.
• что такое short-circuit у `&&`/`||` и разница `i++` vs `++i` (если дошёл до 2-го слоя).