1. Булеві операції
Оператори | і & можна застосовувати не лише до чисел, але й до виразів типу boolean.
Проте, як ти вже знаєш, для логічних виразів є оператори && і ||. Що ж нам дасть використання | замість || і використання & замість &&? Чи є в цьому сенс? Виявляється, є. Іноді.
Логічні оператори || і && виконуються зліва направо за так званим ледачим принципом.
(вираз1) || (вираз2) || (вираз3)
Якщо вираз1 дорівнює true, немає сенсу обчислювати вираз2 і вираз3: результат усе одно буде true.
Тому при обчисленні виразів (а вони обчислюються по порядку зліва направо), як тільки ми отримали true, обчислення решти виразів пропускається. І якщо в виразах вираз2 і вираз3 були виклики якихось функцій, то ці функції не викликаються!
Те саме і для логічного оператора &&:
(вираз1) && (вираз2) && (вираз3)
Якщо вираз1 дорівнює false, немає сенсу обчислювати вираз2 і вираз3: результат усе одно буде false.
Це важливий момент, який дозволяє писати речі типу:
String s = null;
if (s != null && s.length() > 0) {
У прикладі вище ми ніколи не отримаємо NullPointerException, бо вираз s.length() виконується лише якщо перша частина s != null дорівнює true.
Якщо s виявиться рівним null, зліва від оператора && буде значення false, і результат усього логічного виразу буде false, тому обчислення другої частини (s.length() > 0) не відбувається.
Якщо в логічному виразі використовувати оператор | або оператор &, то ледаче обчислення не відбувається — у будь-якому випадку обчислюються всі вирази.
2. Пріоритет операцій у Java
Як ти, мабуть, пам'ятаєш зі шкільного курсу математики, операція множення має вищий пріоритет, ніж операція додавання. Дужки ж мають ще вищий пріоритет: спочатку обчислюються вирази в дужках, а потім уже множення/ділення та додавання/віднімання.
Оператори в Java також мають пріоритет. Тільки: а) їх трохи більше, б) у деяких операторів дії виконуються зліва направо, а в інших — справа наліво.
Ось як виглядає таблиця з усіма операторами Java:
| Категорія | Оператор | Асоціативність |
|---|---|---|
| Постфікс | () [] . |
Зліва направо |
| Унарний | ++ -- ! ~ |
Справа наліво |
| Множення | * / % |
Зліва направо |
| Адитивний | + - |
Зліва направо |
| Зсув | >> >>> << |
Зліва направо |
| Реляційний | > >= < <= |
Зліва направо |
| Рівність | == != |
Зліва направо |
Побітове І (AND) |
& |
Зліва направо |
Виключаюче АБО (XOR) |
^ |
Зліва направо |
Побітове АБО (OR) |
| |
Зліва направо |
Логічне І (AND) |
&& |
Зліва направо |
Логічне АБО (OR) |
|| |
Зліва направо |
| Умовний | ?: |
Справа наліво |
| Присвоєння | = += -= *= /= %= >>= <<= &= ^= |= |
Справа наліво |
| Кома | , |
Зліва направо |
У верхньому рядку йдуть найпріоритетніші оператори. Круглі дужки () використовуються для явного встановлення пріоритету. Квадратні дужки [] використовуються для індексування змінної-масиву. Оператор . використовується для отримання полів і методів у посиланні на об'єкт або клас.
Чим нижче оператори розташовані в таблиці, тим нижчий їхній пріоритет.
Якщо ти використовуєш кілька операторів у своєму виразі, не лінуйся: став дужки.
Так, у Java можна написати щось типу if (a & 1<<b > ~c), але так робити не варто. Ти пишеш код не тільки для компілятора, але й для інших програмістів. Чим код читабельніший, тим краще.
3. Префіксний та постфіксний інкремент
Як ти вже знаєш, у Java є оператор інкременту (++) і оператор декременту (--), які збільшують (і зменшують) значення змінної на 1.
Чого ти, скоріш за все, не знаєш, так це того, що існує два види цих операцій: префіксні – оператор ставиться перед змінною, і постфіксні — оператор ставиться після змінної. І працюють ці оператори трохи по-різному.
У Java можна написати такий вираз:
int a = 5;
int b = a++;
Якщо оператор ++ стоїть після змінної і змінна бере участь у якомусь виразі (як у прикладі вище), то у виразі буде використано поточне значення змінної, а тільки потім вона буде збільшена на 1.
Іншими словами, відбудеться приблизно це:
int a = 5;
int b = a;
a = a + 1;
Тобто, b матиме значення 5, а не 6, як це могло здатися спочатку.
Якщо ж оператор ++ стоїть перед змінною і змінна бере участь у якомусь виразі, вона спершу збільшується на 1, а вже потім її значення бере участь у виразі.
int a = 5;
int b = ++a;
Приклад вище еквівалентний наступному прикладу:
int a = 5;
a = a + 1;
int b = a;
Ось тут уже значення b буде рівне 6.
Є навіть один приклад, який використовують Java-програмісти, щоб визначити, чи їхній співрозмовник теж Java-програміст:
int a = 5;
int b = ++a + ++a;
Так, так теж можна писати.
Цей приклад чудово скомпілюється і перетвориться приблизно в це:
int a = 5;
a = a + 1;
int v1 = a;
a = a + 1;
int v2 = a;
int b = v1 + v2;
Для оператора -- усе точно так само.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ