— Привіт, Білаабо!
— Білаабо радий вітати друга!
Білаабо сьогодні розповість про пріоритет операторів. Але спочатку він розповість про самих операторів.
— А що це таке – ці оператори?
Насправді ти вже знайомий з ними, просто, можливо, не знав, що це – оператори.
Ось, наприклад , є вираз 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)belse c |
int min = a < b? a : b; |
if (a < b)min = a;elsemin = b; |
return a != null ? a.length : 0; |
if (a != null)return a.length;elsereturn 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!freturn +a;< br /> return -a; |
*/% |
a * bc / da % b |
+- |
a + bc - dString s = "count"+"35 "; |
>><<>>><< /td> |
a >> 3b << 2c >>> 3 |
<<=> ;>= |
a < ba <= bc > bc >= b |
==!= |
a == 3a != 0 |
& |
a & 7 |
^ |
a ^ b |
| |
a | b |
& |
(a < b) && (a < c) |
|| |
(b != 0) | | (c != 0) |
? : = |
a > 0? a : -a; |
=*=, /=, %= -=, +=<<=. >>=, >>>=&=, ^=. |= |
|
|
|
|
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ