— Привіт, Білаабо!
— Білаабо радий вітати друга!
Білаабо сьогодні розповість про пріоритет операторів. Але спочатку він розповість про самих операторів.
— А що це таке – ці оператори?
Насправді ти вже знайомий з ними, просто, можливо, не знав, що це – оператори.
Ось, наприклад , є вираз c = a + b;
Тут є два оператори: оператор додавання та оператор присвоєння.
— Тобто. оператори – це математичні знаки? Як множення, розподіл та додавання?
— Ага так і є. Хоча є й відмінності.
Я не даватиму визначення операторів: від цього ти розумнішим не станеш. Краще подивимося їх на ділі. Оператори можна розбити на декілька груп, і ми зараз їх розглянемо.
1) Група «математичні оператори»
Позначення | Приклад | Назва | Опис (що робить) |
---|---|---|---|
+ | a + b < /td> | Оператор додавання | Складає два числа. |
- | c - d | Оператор віднімання | Віднімає друге число з першого. |
* | a * t | Оператор множення< /td> | Умножує два числа. |
/ | a / b < /td> | Оператор поділу | Діляє перше число на друге. |
% | c % d | Залишок від поділу | Обчислює залишок від поділу першого числа на друге. |
- | -a | Одинарний мінус | Змінює знак зміною на зворотний. Плюс на мінус, мінус на плюс. |
+ | +a | Одинарний плюс | Нічого не змінює. Доданий разом із одинарним мінусом для краси. |
— Це я і зі школи знаю – мені залили шкільний курс разом із прошивкою.
А що це ще за відсоток такий чарівний?< /p— Це «залишок від поділу». Якщо 11 ділити націло на 5, то отримаємо 2 і залишок від поділу - 1. Ось цей 1 і можна отримати, якщо записати 11% 5; При розподілі цілих чисел в Java результат теж буде цілим числом. Залишок від поділу просто відкидається. Якщо розділити 8 на 5, то отримаємо 1.
Вираз | Відповідь | |
---|---|---|
19 / 10 | 1 | Якщо ділити націло 19 на 10, отримаємо 1 і 9 у залишку. |
19 % 10 | 9 | Якщо ділити націло 19 на 10, отримаємо 1 і 9 у залишку. |
2 / 5 | 0 | Якщо ділити націло 2 на 5, отримаємо 0 і 2 у залишку. |
16 % 2 | 0 | Якщо ділити націло 16 на 2, отримаємо 8 і 0 у залишку. |
— А навіщо взагалі потрібний цей залишок від поділу?
— Допустимо тобі потрібно перевірити – парне число а чи ні, тоді це можна записати так
if ( a % 2 == 0)
А якщо потрібно перевірити, що b – непарне, тоді це можна записати так
if (b % 2 == 1)
Або, наприклад, чи ділиться d націло на 3:
if (d % 3 == 0)
— Цікаво, я це запам'ятаю.
2) Група «оператори порівняння»
Позначення | Приклад | Назва | Опис (що робить) |
---|---|---|---|
< | a < b | Менше | Перевіряє, що a менше b. |
<= | c <= d | Менше або одно | Перевіряє, що c менше або дорівнює d. |
> | a > b | Більше | Перевіряє, що a більше b. |
>= | c >= d | Більш чи одно | Перевіряє, що c більше або дорівнює d. |
== | i == j | Рівно | Перевіряє, що i дорівнює j. |
!=< /code> | a != 0 | Нерівно | Перевіряє, що a нерівно нулю. |
— Я цим усім уже користувався.
— І яка ж головна відмінність цих операторів від математичних операторів?
— Якщо ми складаємо два числа, то отримуємо число, а якщо порівнюємо два числа – отримуємо true або false.
— Правильно. Результатом порівняння буде «логічне значення» або просто одне значення з пари (true, false), які, як ти знаєш, є значеннями типу boolean.
— Так, тут все зрозуміло, я це вже знаю. Позначення Приклад Назва Опис (що робить) &&
a & & b
AND – «і» Результат виразу true, тільки коли a і b рівні true. ||
c || d
OR – «або» Результат вираження true, якщо a або b дорівнює true. Обидва або хоча б один. !
!a
NOT – «не» Результат вираження true, тільки якщо a дорівнює false.
— Логічні оператори можна застосовувати лише до змінних або виразів логічного типу.
Приклад | Опис< /th> | |||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
boolean a = true; boolean b = true;if (a &&b) | Умова if істинна (true), якщо обидва значення істинні. Тобто. якщо a та b дорівнюють true, то результат – true. | |||||||||||||||||||||||||||||||||||||
boolean a = true; | Умова if істинна ( true), якщо хоча б одне значення — істина. Тобто. якщо a або b рівні true, то результат – true. | |||||||||||||||||||||||||||||||||||||
boolean b = false; | Умова if істинна (true), якщо b — не істина. Тобто. якщо b дорівнює false, то результат – true. | |||||||||||||||||||||||||||||||||||||
int a = 2, b = 3, c = 4;
| Якщо a менше b і a менше c, то результат висловлювання – істина. a,b,c – цілі числа, але результат порівняння цілих чисел – це вже логічне значення (true, false) а значить ми можемо використовувати логічні оператори. Все це я й так знаю. — Так? Тоді продовжимо. 4) Група – «побітові оператори»
— Побітові оператори виконують операцію над цілими числами побітово. — Це як? — Кожне число подається у вигляді набору біт, а потім обчислюється результат за такою схемою: Якщо перший біт в обох числах дорівнює 1, то перший біт результату буде 1. Якщо другий біт в обох числах дорівнює 1, то другий біт результату буде 1. І так далі. Це правда для всіх побітових операторів? — Тут все набагато простіше. Біт може набувати лише двох значень – 0 і 1, так? — Так. — Тоді уяви, що 1 – це true, а 0 – false. Тоді операції над окремими бітами будуть практично такими ж, як і логічні операції:
— О! Так все ж таки дуже просто. — Так, тільки не забувай, що в побітових операціях беруть участь біти двох чисел, які розташовані на тих самих місцях. — Так, я пам'ятаю: перший біт одного числа взаємодіє з першим бітом другого, і результат записується також у перший біт. Для решти бітів – аналогічно. — Правильно. Є ще питання? — А що це за XOR ще такий – «що виключає чи»? — Тут теж все просто: коли значення різні – істина (true, 1), коли однакові – (false, 0). th> | Бітовий вираз | ||||||||||||||||||||||||||||||||||||
true XOR true == false | 1 ^ 1 == 0 | |||||||||||||||||||||||||||||||||||||
false XOR false == false | 0 ^ 0 == 0 | |||||||||||||||||||||||||||||||||||||
true XOR false == true | 1 ^ 0 == 1 | |||||||||||||||||||||||||||||||||||||
false XOR true == true | 0 ^ 1 == 1 |
Ось тобі ще пара прикладів побітових операцій:
Приклад | Числа у бітовому вигляді | Відповідь у бітовому вигляді | Відповідь< /th> |
---|---|---|---|
5 & 3 | 00000101 & 00000011 | 00000001 | 1 |
7 & 2 | 00000111 & 00000010 | 00000010 | 2 |
5 | 9 | 00000101 | 00001001 | 00001101 | 13 |
5 ^ 9 | 00000101 ^ 00001001 | 00001100 | 12 |
~9 | ~00001001 | 11110110 | 246 |
— Дякую, Білаабо. Знатиму.
— Є ще одна група побітових операторів – оператори зсуву:
5) Група «оператори зсуву»
<<
>>>
Позначення | Приклад | Назва | Опис (що робить) |
---|---|---|---|
>> | a >> b | зсув вправо | Зсув біти числа a, на b розрядів вправо. |
c << d | зрушення вліво | Зміщує біти числа c, на d розрядів вліво. | |
a >>> 2 | зсув вправо із заповненням нулем | Зрушує біти числа a, на 2 розряди вправо. |
— Це що за вулична магія?
— Насправді, тут все просто. Ось дивись:
Приклад | Числа у бітовому вигляді | Відповідь у бітовому вигляді | Відповідь |
---|---|---|---|
10 >> 1 | 00001010 >> 1 | 00000101 | 5 |
10 >> 2 | 00001010 >> 2 | 00000010 | 2 |
10 << 1 | 00001010 << 1 | 00010100 | 20 |
10 << 2 | 00001010 << 2 | 00101000 | 40 |
Зсув розрядів числа на 1 ліворуч – те саме, що помножити число на 2. На два розряди дорівнює множенню на 4, на три розряди – множенню на 8 тощо. Зсув вправо – відповідно, розподіл на 2,4,8 ,16,… і так далі.
— А в чому відмінність операторів ">>>" та «>>»?
— Вони відрізняються під час роботи з негативними числами. Справа в тому, що знак негативного числа зберігається в крайньому лівому биті. І при зрушенні праворуч число перестає бути негативним. Тому і придумали два різних оператори, ось дивись:
Вираз | Результат | Опис |
---|---|---|
10001010 >> 1 | 11000101 | Негативне число залишається негативним. Нові розряди заповнюються 1 для негативних чисел. |
10001010 >> 2 | 11100010 | |
10001010 >> 3 | 11110001 | |
10001010 >>> 1 | 01000101 | Негативне число перестає бути негативним. Нові розряди заповнюються 0 для негативних чисел. |
10001010 >>> 2 | 00100010 | |
10001010 >>> 3 | 00010001 |
Зсув не циклічний. Біти, які опинилися за краєм числа ліворуч або праворуч, просто відкидаються. span class="text-user">— Привласнення я вже знаю. А чому ти кажеш оператори?
— Тому що їх дещо ☺
Оператор | Що він означає |
---|---|
a += b; | a = a + b; |
a -= b; | a = a - b; |
a *= b; | a = a * b; |
a %= b; | a = a % b; |
a |= b; | a = a | b; |
a &= b; | a = a & b; |
Думаю, логіка тобі зрозуміла.
7) Група «< strong>оператори інкременту та декременту»
Запис | Приклад | Опис |
---|---|---|
++ | a++; ++b; | Збільшує число на 1. |
-- | d--; --i; | Зменшує число/змінну на 1. td> |
— А в чому відмінність, коли два мінуси спереду чи ззаду?
— А відмінність є. Хоч і не дуже велике. Якщо змінна з таким оператором бере участь у якомусь вираженні чи привласненні, тут виникають відмінності. Давай я краще покажу тобі на прикладі:
int a = 3;
int b = a;
a = a + 1;
Приклад | Що відбувається насправді< /th> | Опис |
---|---|---|
int a = 3; int b = + +a; | int a = 3; a = a + 1; int b = a; | а спочатку збільшується на 1, потім бере участь у виразі. |
int a = 3;< /code> | а спочатку бере участь у виразі, потім збільшується на 1. | |
int a = 3; return a++; | int a = 3; int result = a; a = a + 1; return result; | < td>функція поверне 3, але значення a буде збільшено на 1. |
int x = 5; x = + +x + ++x; | int x = 5; int a = x + 1;//перший доданок 6< /code> | тут буде відповідь 13. Спочатку x збільшиться на 1, і це значення підставиться на місце першого доданку, а потім х збільшиться ще раз на 1. |
— Нічого собі! Оце круто!
— Радий що тобі сподобалося. Але, якщо немає жодного виразу чи привласнення, то жодних відмінностей немає: Просто «x++» еквівалентно x = x + 1.
Просто «++x» теж еквівалентно x = x + 1.
— Знатиму, дякую, Білаабо.
8) Група «тернарний оператор»
— У цьому операторі беруть участь не одна змінна/вираз і не дві, а відразу три:
Ось як він записується | А ось чому він еквівалентний: |
---|---|
a ? b : c; | if (a) b else c |
int min = a < b? a : b; | if (a < b) min = a; else min = b; |
return a != null ? a.length : 0; | if (a != null) return a.length; else return 0; |
— Так це дуже зручна штука.
— Ага. І компактно і код читабельний. Користуйся на здоров'я. Скільки музику не розбирай, а папку «різне» створити доведеться.
— Так, кожен, хто хоч раз це робив, повністю з тобою згоден.
— Так ось, є ще три оператори, про які я хотів тобі розповісти:
Запис | Приклад | Опис |
---|---|---|
() | (a + b) * c | Купки підвищують пріоритет виконання. Спочатку виконується те, що в дужках. |
[] | c [i] = c [i + 1]; | Отримання елемента масиву за індексом. |
. | int n = a.length; | «оператор точка» – отримання змінних та методів у об'єкта. |
І, нарешті, пріоритет операторів та порядок їх виконання:
Оператори | Приклади |
---|---|
() [] . < /td> | (a + b) c[i] = c[i] + 1 |
++ -- ~ ! + - | i++; ++i; --j; a--; ~c !f return +a; < br /> return -a; |
* / % | a * b c / d a % b |
+ - | a + b c - d String s = "count"+"35 "; |
>> << >>> << /td> | a >> 3 b << 2 c >>> 3 |
< <= > ; >= | a < b a <= b c > b c >= b |
== != | a == 3 a != 0 |
& | a & 7 |
^ | a ^ b |
| | a | b |
& | (a < b) && (a < c) |
|| | (b != 0) | | (c != 0) |
? : = | a > 0? a : -a; |
= *=, /=, %= -=, += <<=. >>=, >>>= &=, ^=. |= | |
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ