Приоритет на оператора - 1

„Здравей, Билаабо!“

„Билаабо се радва да поздрави своя приятел!“

„Днес Билаабо ще ви разкаже за приоритета на операторите. Но първо ще ви разкаже за самите оператори.“

— Какви са тези оператори, за които говорите?

„Всъщност вече сте запознати с тях. Просто може да не сте знаели, че се наричат ​​оператори.“

„Например, да кажем, че имаме израза  c = a + b;

„Има два оператора: оператор за добавяне и оператор за присвояване.“

"С други думи, операторите са просто математически знаци? Като умножение, деление и събиране?"

"Да, това е вярно. Има обаче разлики."

„Няма да дефинирам оператори за вас: една дефиниция няма да ви направи по-умни. По-добре е да ги видите в действие. Операторите могат да бъдат разделени на няколко групи, които ще разгледаме сега.“

1) " Математически оператори "

Символ Пример Име Описание (Howво прави)
+ a + b Оператор за добавяне Оператор за добавяне.
- c - d Оператор за изваждане Изважда второто число от първото.
* a * t Оператор за умножение Умножава две числа.
/ a / b Оператор на разделяне Дели първото число на второто.
% c % d Дели първото число на второто. Изчислява остатъка след разделяне на първото число на второто.
- -a Унарен минус Променя знака на променливата на противоположния.
Плюс към минус и минус към плюс.
+ +a Унарен плюс Не променя нищо. Това беше добавено, за да допълни унарния минус оператор. Това е само за външен вид.

„Разпознавам ги от учorще. Моят фърмуер включва учorщни курсове.“

„Но Howво е с този знак за процент, няHowва магия?“

„Това е операторът „ остатък след деление “. Ако 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.

— Но за Howво, по дяволите, ни трябва остатъкът?

"Да предположим, че трябва да проверите дали дадено цяло число е четно. Тогава можете да напишете:"

if (a % 2 == 0)

„И ако трябва да проверите дали b е странно, тогава можете да напишете:“

if (b % 2 == 1)

"Или за да проверите дали d се дели на 3:"

if (d % 3 == 0)

— Интересно. Ще го запомня.

2)  " Оператори за сравнение "

Символ Пример Име Описание (Howво прави)
< a < b По-малко от Проверява дали a е по-малко от b.
<= c <= d По-малко or равно на Проверява дали c е по-малко or равно на d.
> a > b По-велик от Проверява дали a е по-голямо от b.
>= c >= d По-голямо or равно на Проверява дали c е по-голямо or равно на d.
== i == j равно на Проверява дали i е равно на j.
!= a != 0 Не е равно на Проверява дали a не е равно на нула.

„Вече използвам всички тези.“

"И Howва е основната разлика между тези оператори и математическите оператори?"

"Ако съберем две числа, получаваме число; но ако сравним две числа, получаваме вярно or невярно."

„Точно така. Резултатът от сравнението е стойност на „ логическа стойност “, която, Howто знаете, е представена от булевия тип. Има две възможности: вярно or невярно.

"Да, всичко е ясно. Вече го знам."

3) " Логически оператори "

Символ Пример Име Описание (Howво прави)
&& a && b И Резултатът от израза е верен само когато и двете a и b са верни.
|| c || d ИЛИ Резултатът от израза е верен, ако a or b е вярно. И двете or поне едната.
! !a НЕ Резултатът от израза е верен само ако a е невярно.

„Логическите оператори могат да се използват само с булеви променливи or изрази.“

Пример Описание
boolean a = true;
boolean b = true;if (a && b)
Условието if е true, ако и двете стойности са true.
С други думи, ако и a, и b са true, тогава резултатът е true .
boolean a = true;
boolean b = false;if (a || b)
Условието if е true, ако поне една стойност е true.
С други думи, ако a or b е true, тогава резултатът е true .
boolean b = false;

if (!b)

Условието if е вярно, ако b не е вярно.
С други думи, ако   b е невярно , тогава резултатът е  вярно .
int a = 2, b = 3, c = 4;

if (a < b && a < c)
if ((a < b) && (a < c))

Ако a е по-малко от b и a е по-малко от c, тогава резултатът от израза е верен.
a, b и c са цели числа, но резултатът от сравняването на цели числа е логическа стойност (true, false), което означава, че можем да използваме логически оператори.

— Вече знам всичко това.

"Наистина ли? Тогава да продължим."

4) " Побитови оператори "

Символ Пример Име Описание (Howво прави)
& a & b И Побитово И
| c | d ИЛИ Побитово ИЛИ
~ ~a НЕ Побитово НЕ
^ a ^ b XOR Побитово „ИЗКЛЮЧИТЕЛНО ИЛИ“

" Побитовите оператори изпълняват битови операции с цели числа."

"Какво е това?"

„Всяко число се представя като набор от битове и след това резултатът се изчислява, Howто следва:“

„Ако първият бит на двете числа е 1, тогава първият бит на резултата ще бъде 1.“

„Ако вторият бит на двете числа е 1, тогава вторият бит на резултата ще бъде 1. И така нататък.“

„Това вярно ли е за всички битови оператори?“

„Много по-просто е от това. Битът може да има само две стойности, 0 и 1, нали?“

— Правилно.

„Тогава смятайте 1 за вярно и 0 за невярно. Операциите върху отделни битове тогава ще бъдат почти идентични с логическите операции:“

Логически израз Побитово изразяване
вярно && вярно == вярно 1&1 == 1
вярно && невярно == невярно 1&0 == 0
вярно || вярно == вярно 1|1 == 1
вярно || невярно == вярно 1|0 == 1
невярно || невярно = невярно 0|0 == 0
!false == true ~0 == 1
!true == false ~1 == 0

"О! Това е толкова лесно."

„Да, само не забравяйте, че побитовите операции използват съответни битове от две числа.“

„Да, помня: първият бит на едно число се свързва с първия бит на второто и резултатът също се записва в първия бит. Същото важи и за останалите битове.“

"Така е. Имате ли други въпроси?"

„Какво става с XOR и „изключително or“?“

"Това е парче торта: когато стойностите са различни, това е вярно; когато са еднакви, това е невярно."

Логически израз Побитово изразяване
true XOR true == false 1 ^ 1 == 0
невярно XOR невярно == невярно 0 ^ 0 == 0
true XOR false == true 1 ^ 0 == 1
false XOR true == true 0 ^ 1 == 1

Ето още няколко примера за битови операции:

Пример Числата като битове Резултат като битове Резултат
5 & 3 0000010 1  и 0000001 1 0000000 1 1
7 & 2 000001 1 1 и 000000 1 0 00000010 2
5 | 9 00000 1 0 1  | 0000 1 00 1 00001101 13
5 ^ 9 00000 101  ^ 00001001 0000 1100 12
~9 ~ 00001001 11110110 246

„Благодаря ти, Билаабо. Сега знам.“

„Има още една група побитови оператори, операторите за смяна:“

5) " Оператори за преместване "

Символ Пример Име Описание (Howво прави)
>> a >> b дясна смяна Измества битовете на числото a надясно с b цифри.
<< c << d ляво изместване Измества битовете на числото c наляво с d цифри.
>>> a >>> 2 неподписано дясно изместване Измества битовете на числото a надясно с 2 цифри.

— Що за улична магия е това?

„Всъщност всичко е много просто. Вижте го:“

Пример Числата като битове Резултат като битове Резултат
10 >> 1 0000 101 0 >> 1 00000 101 5
10 >> 2 0000 101 0 >> 2 000000 10 2
10 << 1 0000 101 0 << 1 000 101 00 20
10 << 2 0000 101 0 << 2 00 101 000 40

„Преместването на битовете на числото наляво с 1 е същото като умножаването на числото по 2. Преместването с две цифри е еквивалентно на умножение по 4, с три цифри — умножение по 8 и т.н.“

„Преместването надясно съответства на делене на 2, 4, 8, 16 и т.н.“

„Но Howва е разликата между операторите >>> и >>?“

„Те се различават, когато работят с отрицателни числа. Това е така, защото  числата със знак използват най-левия бит, за да укажат знака. В резултат на това отрицателно число престава да бъде отрицателно, когато се премести надясно. Така че те излязоха с два различни оператора. Виж това:"

Изразяване Резултат Описание
1 000 1010 >> 1 11 000 101 Отрицателното число остава отрицателно.
За отрицателни числа, входящите битове се запълват с 1s.
1 000 1010 >> 2 111 000 10
1 000 1010 >> 3 1111 000 1
1 000 1010 >>> 1 01 000 101 Отрицателното число вече не е отрицателно. За отрицателни числа входящите битове се запълват с нули.
1 000 1010 >>> 2 001 000 10
1 000 1010 >>> 3 0001 000 1

"Промяната не е циклична. Битовете, които се преместват отвъд левия or десния край на числото, просто се изхвърлят."

6) " Оператори за присвояване "

„Вече знам Howво е присвояване. Но защо казвате „оператори“?“

"Защото има няколко от тях ☺"

Оператор Какво означава
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) " Оператори за увеличаване и намаляване "

Нотация Пример Описание
++ a++;
++b;
Увеличава числото с 1.
-- d--;
--i;
Намалява числото or променливата с 1.

„Има ли разлика между поставянето на двата знака минус преди or след променливата?“

„Да, има, макар и не много голяма. Ако променлива с един от тези оператори е част от израз or присвояване, тогава има разлики. Предпочитам да ви покажа с пример:“

Пример Какво наистина се случва Описание
int a = 3;
int b = ++a;
int a = 3;
a = a + 1;
int b = a;
a първо се увеличава с 1 и след това се използва в израза.
int a = 3;
int b = a++;
int a = 3;
int b = a;
a = a + 1;
a първо се използва в израза и след това се увеличава с 1.
int a = 3;
return a++;
int a = 3;
int result = a;
a = a + 1;
return result;
Функцията ще върне 3, но стойността на a ще бъде увеличена с 1.
int x = 5;
x = ++x + ++x;
int x = 5;
int a = x + 1;// The first term is 6
x = a;
int b = x + 1;// The second term is 7
x = b;
x = a + b;
Резултатът тук е 13. Първо, x ще се увеличи с 1 и тази стойност ще замени първия член, а след това x отново ще се увеличи с 1.

„Уау! Това е страхотно!“

"Радвам се, че ви хареса. Но ако няма израз or задание, тогава няма разлики:"

"x++ е еквивалентно на x = x + 1."

"++x е еквивалентно на x = x + 1."

— Ще го имам предвид. Благодаря, Билаабо.

8)  " Троичен оператор "

„Този ​​оператор не използва само една or две променливи or изрази. Той използва три променливи or изрази наведнъж:“

Нотация Еквивалентен code:
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;

— Е, това е супер удобно.

„Да. Компактен е и codeът е четлив. Приятно използване!“

9) " Друго "

„Без meaning колко добре е организирана вашата музикална колекция, все пак трябва да създадете папка „Разни“.

„Да, всеки, който някога е трябвало да категоризира музиката, би се съгласил напълно.“

„И така, има още три оператора, за които искам да ви разкажа:“

Нотация Пример Описание
() (a + b) * c Скобите увеличават приоритета на оператора.
Нещата в скоби се изпълняват първи.
[] c [i] = c [i + 1]; Вземете елемент от масив по индекс.
. int n = a.length; Операторът " точка " има достъп до променливите и методите на обекта.

„И накрая, ето table, която обобщава приоритета на операторите:“

Оператори Примери
Най-висок приоритет (операторите се изпълняват според реда им в тази table)
()
[]
.
(a + b)
c [i] = c [i] + 1
++
--
~
!
+
-
i++; ++i;
--j; a--;
~c
!f
return +a;
return -a;
*
/
%
a * b
c / d
a % b
+
-
a + b
c - d
String s = "count"+"35";
>>
<<
>>>
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;
=
*=, /=, %=
-=, +=
<<=. >>=, >>>=
&=, ^=. |=
Най-нисък приоритет (изпълнен последен)