Пріоритет операторів - 1

— Привіт, Білаабо!

— Білаабо радий вітати друга!

Білаабо сьогодні розповість про пріоритет операторів. Але спочатку він розповість про самих операторів.

— А що це таке – ці оператори?

Насправді ти вже знайомий з ними, просто, можливо, не знав, що це – оператори.

Ось, наприклад , є вираз 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; boolean b = false;if (a || b) Умова if істинна ( true), якщо хоча б одне значення — істина.
Тобто. якщо a або b рівні true, то результат – true.
boolean b = false;

if (!b)

Умова if істинна (true), якщо b — не істина.
Тобто. якщо b дорівнює false, то результат – true.
int a = 2, b = 3, c = 4;

if (a < b && a < c)
еквівалентно
if ((a < b) && (a < c))< /span>

Якщо a менше b і a менше c, то результат висловлювання – істина.
a,b,c – цілі числа, але результат порівняння цілих чисел – це вже логічне значення (true, false) а значить ми можемо використовувати логічні оператори. Все це я й так знаю.

— Так? Тоді продовжимо.

4) Група – «побітові оператори»

Позначення Приклад Назва Опис (що робить )
& a & b AND – «і» Побітове «І»
< code>| c | d OR – «або» Побітове «АБО»
< code>~ ~a NOT – «ні» Побітове "НЕ"
^ a ^ b < strong>XOR – «що виключає або» Побітове «ВИКЛЮЧНЕ АБО»

— Побітові оператори виконують операцію над цілими числами побітово.

— Це як?

— Кожне число подається у вигляді набору біт, а потім обчислюється результат за такою схемою: Якщо перший біт в обох числах дорівнює 1, то перший біт результату буде 1. Якщо другий біт в обох числах дорівнює 1, то другий біт результату буде 1. І так далі. Це правда для всіх побітових операторів?

— Тут все набагато простіше. Біт може набувати лише двох значень – 0 і 1, так?

— Так.

— Тоді уяви, що 1 – це true, а 0 – false. Тоді операції над окремими бітами будуть практично такими ж, як і логічні операції:

Логічний вираз Битовий вираз
true && true == true 1&1 == 1
true && false == false 1&0 == 0
true || true == true 1|1 == 1
true || false == true 1|0 == 1
false || false = false 0|0 == 0
!false == true< /strong> ~0 == 1
!true == false ~1 == 0

— О! Так все ж таки дуже просто.

— Так, тільки не забувай, що в побітових операціях беруть участь біти двох чисел, які розташовані на тих самих місцях.

— Так, я пам'ятаю: перший біт одного числа взаємодіє з першим бітом другого, і результат записується також у перший біт. Для решти бітів – аналогічно.

— Правильно. Є ще питання?

— А що це за 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) Група «оператори зсуву»

<<>>>
< td> < td> < /tbody>
Позначення Приклад Назва Опис (що робить)
>> 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;
< td>функція поверне 3, але значення a буде збільшено на 1.
Приклад Що відбувається насправді< /th> Опис
int a = 3;
int b = + +a;
int a = 3;
a = a + 1;
int b = a;
а спочатку збільшується на 1, потім бере участь у виразі.
int a = 3;< /code>int b = a++; а спочатку бере участь у виразі, потім збільшується на 1.
int a = 3;
return a++;
int a = 3;
int result = a;
a = a + 1;
return result;
int x = 5;
x = + +x + ++x;
int x = 5;
int a = x + 1;//перший доданок 6< /code>
x = a;
int b = x + 1;//другий доданок 7
x = b;
x = a + b;
тут буде відповідь 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;
=
*=, /=, %= -=, +=
<<=. >>=, >>>=
&=, ^=. |=
Нижчий пріоритет (виконуються в самому кінці)