Go’da operatorlar
Operator — qiymatlar ustida ma’lum bir amal bajaradigan belgi yoki belgilar birikmasi.
Masalan:
+ikki sonni qo‘shadi;==ikkita qiymat teng yoki teng emasligini tekshiradi;&&bir nechta mantiqiy shartni birlashtiradi.
Operator ishlaydigan qiymatlar operand deyiladi.
Masalan:
Bu ifodada:
+— operator;a— birinchi operand;b— ikkinchi operand.
Go’da operatorlar arifmetik hisob-kitoblar, qiymatlarni taqqoslash, shartlarni tekshirish, bitlar bilan ishlash va o‘zgaruvchilar qiymatini yangilash kabi ko‘plab vazifalarda ishlatiladi.
Arifmetik operatorlar
Arifmetik operatorlar sonlar ustida matematik amallar bajaradi.
| Operator | Amal | Misol | Natija |
|---|---|---|---|
+ |
qo‘shish | 10 + 3 |
13 |
- |
ayirish | 10 - 3 |
7 |
* |
ko‘paytirish | 10 * 3 |
30 |
/ |
bo‘lish | 10 / 3 |
3 |
% |
qoldiqli bo‘lish | 10 % 3 |
1 |
Quyidagi dastur barcha asosiy arifmetik operatorlarni ko‘rsatadi:
| main.go | |
|---|---|
Natija:
Bu yerda a va b ikkalasi ham int turidagi butun sonlar.
Shuning uchun:
ifodasi ham butun sonli bo‘lish sifatida bajariladi.
10 / 3 matematik jihatdan 3.333... bo‘lsa ham, Go bu yerda faqat butun qismini qoldiradi. Natija 3 bo‘ladi.
Butun va kasrli sonlarni bo‘lish
Go’da bo‘lish natijasining turi operandlarning turiga bog‘liq.
Agar ikkala operand ham butun son bo‘lsa, natija ham butun son bo‘ladi. Kasr qismi tashlab yuboriladi:
Bu hisob quyidagicha ishlaydi:
Lekin ikkala operand ham int bo‘lgani uchun kasr qismi saqlanmaydi:
Agar kasrli natija kerak bo‘lsa, operandlarni float32 yoki float64 kabi kasrli turga o‘tkazish kerak.
Masalan:
| main.go | |
|---|---|
Natija:
Bu yerda:
jami qiymatini int turidan float64 turiga o‘tkazadi.
Xuddi shunday:
ham odamlar qiymatini float64 turiga o‘tkazadi.
Shundan keyin hisob:
ko‘rinishida bajariladi va kasr qismi saqlanadi.
fmt.Printf ichidagi:
natijani kasrdan keyin ikkita raqam bilan chiqaradi.
Warning
Nolga bo‘lish mumkin emas.
Butun sonni `0`ga bo‘lish runtime paytida xatoga olib keladi.
Masalan, quyidagi kod xavfli:
```go
boluvchi := 0
natija := 10 / boluvchi
```
`boluvchi` qiymati runtime paytida `0` bo‘lgani uchun dastur bajarilish vaqtida panic yuz beradi.
Qoldiqli bo‘lish
% operatori bo‘lishdan keyin qolgan qoldiqni qaytaradi.
Masalan:
Hisobni bosqichma-bosqich ko‘ramiz:
Demak:
Qoldiq operatori ko‘p joyda foydali.
Masalan:
- son juft yoki toqligini tekshirish;
- vaqtni soat, daqiqa va sekundga ajratish;
- davriy hisob-kitoblar;
- indekslarni aylantirib ishlatish.
Muhim jihat: % Go’da butun sonlar bilan ishlaydi.
Birga oshirish va kamaytirish
++ operatori qiymatni bittaga oshiradi.
-- operatori esa qiymatni bittaga kamaytiradi.
Masalan:
| main.go | |
|---|---|
Natija:
Dastur boshida:
Keyin:
bajariladi:
So‘ng:
bajariladi:
Bu operatorlar boshqa ayrim dasturlash tillaridagi kabi ifoda emas.
Go’da hisob++ va hisob-- alohida statement, ya’ni alohida buyruq hisoblanadi.
Shuning uchun ularni boshqa ifodaning ichiga joylab bo‘lmaydi:
Masalan, C yoki JavaScript’da uchrashi mumkin bo‘lgan:
usuli Go’da mavjud emas.
Bu qoida kodni tushunarliroq qiladi. Qiymatning qachon oshirilgani yoki kamaytirilgani alohida qatorda aniq ko‘rinib turadi.
Tayinlash operatorlari
= operatori o‘ng tomondagi qiymatni chap tomondagi mavjud o‘zgaruvchiga tayinlaydi.
Masalan:
Birinchi qatorda:
yangi son o‘zgaruvchisi yaratiladi va unga 10 qiymati beriladi.
Ikkinchi qatorda:
yangi o‘zgaruvchi yaratilmaydi. Mavjud son o‘zgaruvchisining qiymati 20ga o‘zgartiriladi.
Go’da arifmetik amal va tayinlashni bitta qisqa operator bilan yozish mumkin:
| Qisqa yozuv | To‘liq yozuv |
|---|---|
son += 5 |
son = son + 5 |
son -= 5 |
son = son - 5 |
son *= 5 |
son = son * 5 |
son /= 5 |
son = son / 5 |
son %= 5 |
son = son % 5 |
Masalan:
| main.go | |
|---|---|
Natija:
Hisobni bosqichma-bosqich ko‘ramiz.
Boshlang‘ich qiymat:
Keyin:
aslida quyidagini anglatadi:
Natija:
Keyin:
quyidagiga teng:
Natija:
Bu yerda := va = o‘rtasidagi farqni eslab qolish muhim.
:= odatda yangi lokal o‘zgaruvchi e’lon qilish va unga boshlang‘ich qiymat berish uchun ishlatiladi.
= esa mavjud o‘zgaruvchiga yangi qiymat tayinlaydi.
Taqqoslash operatorlari
Taqqoslash operatorlari ikkita qiymatni solishtiradi.
Taqqoslash natijasi har doim bool turida bo‘ladi:
yoki:
Asosiy taqqoslash operatorlari:
| Operator | Ma’nosi | Misol | Natija |
|---|---|---|---|
== |
teng | 10 == 10 |
true |
!= |
teng emas | 10 != 3 |
true |
> |
katta | 10 > 3 |
true |
< |
kichik | 10 < 3 |
false |
>= |
katta yoki teng | 10 >= 10 |
true |
<= |
kichik yoki teng | 3 <= 10 |
true |
Masalan:
| main.go | |
|---|---|
Natija:
Birinchi taqqoslash:
quyidagicha:
Bu noto‘g‘ri, shuning uchun natija:
Ikkinchi taqqoslash:
Bu to‘g‘ri:
Uchinchi shart:
ham to‘g‘ri. Demak, minimal yosh talabi bajarilgan.
Info
= va == bir xil operator emas.
Mantiqiy operatorlar
Mantiqiy operatorlar bool qiymatlar bilan ishlaydi.
Ular bir nechta shartni birlashtirish yoki shartning teskarisini olish uchun ishlatiladi.
| Operator | Nomi | Qachon true bo‘ladi? |
|---|---|---|
&& |
VA | ikkala shart ham true bo‘lsa |
\|\| |
YOKI | shartlardan kamida bittasi true bo‘lsa |
! |
EMAS | operand false bo‘lsa |
Info
bool qiymatlar uchun tartib taqqoslashlari, masalan < yoki >, ishlatilmaydi.
`bool` qiymatlarini tenglik bo‘yicha taqqoslash uchun `==` va `!=` operatorlaridan foydalanish mumkin.
Masalan:
| main.go | |
|---|---|
Natija:
Bu ifodani alohida qismlarga ajratamiz:
Natija:
Keyingi qiymat:
uning qiymati allaqachon:
Keyin:
taqiqlangan qiymati:
! operatori uni teskarisiga o‘giradi:
Shuning uchun umumiy ifoda:
bo‘ladi.
Natija:
Demak, foydalanuvchining yoshi yetarli, chiptasi bor va unga kirish taqiqlanmagan.
Mantiqiy jadval:
a |
b |
a && b |
a \|\| b |
|---|---|---|---|
false |
false |
false |
false |
false |
true |
false |
true |
true |
false |
false |
true |
true |
true |
true |
true |
&& operatorida ikkala tomon ham true bo‘lishi kerak.
Masalan:
|| operatorida esa kamida bitta tomon true bo‘lishi yetarli:
! operatori qiymatni teskarisiga o‘zgartiradi:
Qisqa tutashuv
&& va || operatorlari barcha operandlarni har doim ham hisoblamaydi.
Natija oldindan ma’lum bo‘lib qolsa, Go ifodaning qolgan qismini tekshirmaydi.
Bu qisqa tutashuv, ya’ni short-circuit evaluation deyiladi.
Masalan:
Bu ifodani bosqichma-bosqich ko‘ramiz.
Birinchi shart:
boluvchi qiymati 0, shuning uchun:
&& operatorida umumiy natija true bo‘lishi uchun ikkala tomon ham true bo‘lishi kerak.
Birinchi tomon allaqachon false.
Demak, umumiy natija ham albatta false bo‘ladi.
Shu sabab Go ikkinchi qismni hisoblamaydi:
Agar bu qism bajarilganida:
nolga bo‘lish yuz berardi.
Lekin short-circuit tufayli bu hisob umuman bajarilmaydi.
|| operatorida ham shunga o‘xshash qoida ishlaydi.
Masalan:
Birinchi operand true bo‘lgani uchun umumiy natija allaqachon true.
Shuning uchun murakkabTekshiruv() chaqirilmaydi.
Bit operatorlari
Bit operatorlari butun sonlarning ikkilik, ya’ni binary ko‘rinishi ustida ishlaydi.
Masalan, o‘nlik sanoq sistemasidagi:
ikkilik ko‘rinishda:
bo‘ladi.
Bit operatorlari quyidagi vazifalarda uchrashi mumkin:
- bir nechta ruxsatni bitta qiymatda saqlash;
- bit flag va bitmask bilan ishlash;
- protokol yoki fayl formatlarini qayta ishlash;
- past darajali hisob-kitoblar;
- ma’lum bitlarni yoqish yoki o‘chirish.
Asosiy bit operatorlari:
| Operator | Amal |
|---|---|
& |
bit bo‘yicha VA |
\| |
bit bo‘yicha YOKI |
^ |
bit bo‘yicha XOR yoki unary holatda bitlarni inkor qilish |
&^ |
bitni tozalash — AND NOT |
<< |
chapga surish |
>> |
o‘ngga surish |
Misol:
| main.go | |
|---|---|
Natija:
Endi bu natijalar qanday hosil bo‘lishini ko‘ramiz.
a:
b:
Qulay bo‘lishi uchun ularni bir xil uzunlikda yozamiz:
& — bit bo‘yicha VA
Har bir bit juftligi tekshiriladi.
Faqat ikkala bit ham 1 bo‘lsa, natijada 1 qoladi.
Natija:
| — bit bo‘yicha YOKI
Kamida bittasi 1 bo‘lsa, natija biti 1 bo‘ladi.
Natija:
^ — XOR
Ikki operandli ^ operatorida bitlar har xil bo‘lsa 1, bir xil bo‘lsa 0 hosil bo‘ladi:
Natija:
^ unary operator sifatida bitta butun songa qo‘llansa, uning barcha bitlarini teskarisiga o‘giradi. Bunda natija turning bit kengligiga bog‘liq bo‘ladi.
<< — chapga surish
Quyidagi ifoda:
a qiymatining bitlarini bir pozitsiya chapga suradi.
Boshlang‘ich qiymat:
Bir bit chapga:
Bu o‘nlik sanoq sistemasida:
ga teng.
Hozircha bu operatorlarning asosiy vazifasini tushunib olish yetarli. Keyingi misollarda bit flaglar bilan amaliy ishlatilishini ko‘ramiz.
Operatorlar ustuvorligi
Bitta ifodada bir nechta operator qatnashsa, Go ularni ma’lum ustuvorlik tartibida bajaradi.
Masalan:
Bu ifoda:
ko‘rinishida.
* operatorining ustuvorligi +dan yuqori.
Shuning uchun avval:
hisoblanadi.
Keyin:
Natija:
Agar qavs ishlatsak:
avval qavs ichidagi ifoda bajariladi:
Keyin:
Natija:
Soddalashtirilgan ustuvorlik tartibi yuqoridan pastga quyidagicha:
*,/,%,<<,>>,&,&^;+,-,|,^;==,!=,<,<=,>,>=;&&;||.
Bir guruh ichidagi operatorlar bir xil ustuvorlikka ega.
Ifoda murakkablashib ketsa, faqat operatorlar ustuvorligiga ishonib yozish shart emas.
Qavs ishlatish ko‘pincha kodning maqsadini aniqroq ko‘rsatadi.
Masalan:
texnik jihatdan to‘g‘ri bo‘lishi mumkin.
Lekin:
ko‘rinishi o‘quvchiga hisob qanday guruhlanganini aniqroq ko‘rsatadi.
Keyingi qismda operatorlardan foydalanib sodda matematik hisob-kitoblarni bajaramiz.
Misollar
1. Juft yoki toq sonni aniqlash
Bu misol % operatoridan foydalanib sonning juft yoki toqligini tekshirishni ko‘rsatadi.
son % 2 sonni 2ga bo‘lgandagi qoldiqni hisoblaydi.
17 uchun:
Keyin:
aslida:
bo‘ladi.
Natija:
Agar son juft bo‘lsa, uni 2ga bo‘lganda qoldiq 0 bo‘ladi.
Masalan:
Shuning uchun % 2 == 0 juft sonni tekshirishning keng tarqalgan usuli hisoblanadi.
2. Qiymatni oraliqda tekshirish
Bu misol bitta qiymat ikkita chegara orasida ekanini tekshiradi.
package main
import "fmt"
func main() {
yosh := 24
mehnatYoshi := yosh >= 18 && yosh <= 60
fmt.Println(mehnatYoshi)
}
Ifodani ikkita qismga ajratamiz:
va:
yosh qiymati 24.
Demak:
Keyin && ishlaydi:
Natija:
Bu yerda && ishlatilganining sababi shuki, yosh ikkala talabga ham bir vaqtda mos kelishi kerak.
3. Qiymatni ketma-ket yangilash
Bu misolda tayinlash operatorlarining qisqa ko‘rinishlari va -- operatori birgalikda ishlatiladi.
Boshlang‘ich qiymat:
Birinchi amal:
quyidagiga teng:
Endi:
Keyin:
quyidagiga teng:
Endi:
Oxirida:
qiymatni bittaga kamaytiradi:
Natija:
Bu misol qiymatni bir necha amal orqali ketma-ket o‘zgartirishni ko‘rsatadi.
4. Qisqa tutashuv
Bu misol && operatorining short-circuit xususiyati nolga bo‘lishning oldini qanday olishini ko‘rsatadi.
package main
import "fmt"
func main() {
boluvchi := 0
xavfsiz := boluvchi != 0 && 10/boluvchi > 1
fmt.Println(xavfsiz)
}
Avval:
tekshiriladi.
Qiymat:
Shuning uchun:
&&ning chap tomoni false bo‘lsa, umumiy ifoda ham false bo‘lishi aniq.
Go o‘ng tomonni hisoblamaydi:
Shu sabab:
amali bajarilmaydi va nolga bo‘lish xatosi yuz bermaydi.
Natija:
Bu usul ko‘pincha xavfli amalni bajarishdan oldin kerakli shartni tekshirish uchun ishlatiladi.
5. Qoldiq bilan vaqtni ajratish
Bu misol / va % operatorlari yordamida umumiy sekundlarni soat, daqiqa va sekundlarga ajratadi.
package main
import "fmt"
func main() {
jamiSekund := 3672
soat := jamiSekund / 3600
daqiqa := jamiSekund % 3600 / 60
sekund := jamiSekund % 60
fmt.Println(soat, daqiqa, sekund)
}
Boshlang‘ich qiymat:
Avval soatni topamiz:
Hisob:
Demak:
Endi to‘liq soatdan keyin qancha sekund qolganini topamiz:
Bu 72 sekund ichidan daqiqani topamiz:
Demak:
Oxirida to‘liq daqiqalardan keyingi qoldiq sekundlarni topamiz:
Demak:
Natija:
Ya’ni:
Bu yerda / to‘liq birliklar sonini oladi, % esa keyingi bosqich uchun qolgan qismini ajratadi.
6. Bit yordamida bayroqni yoqish
Bu misol bit flag yordamida yangi ruxsatni mavjud qiymatga qo‘shishni ko‘rsatadi.
package main
import "fmt"
func main() {
const yozish = 1 << 1
ruxsat := 1
ruxsat |= yozish
fmt.Printf("%03b\n", ruxsat)
}
Avval:
hisoblanadi.
1ning binary ko‘rinishi:
Uni bir bit chapga suramiz:
Demak:
Keyin:
Binary ko‘rinishda:
Quyidagi operator:
aslida:
degani.
Hisob:
Natija:
| kerakli bitni yoqadi va boshqa yoqilgan bitlarni saqlab qoladi.
Shu sabab bit flaglar to‘plamiga yangi ruxsat qo‘shishda bu operator juda qulay.
7. Bit yordamida bayroqni tekshirish
Bu misol ma’lum bir bit yoqilgan yoki yoqilmaganini tekshiradi.
package main
import "fmt"
func main() {
const yozish = 1 << 1
ruxsat := 0b011
fmt.Println(ruxsat&yozish != 0)
}
yozish qiymati:
ruxsat esa:
Endi & operatorini qo‘llaymiz:
Natija 0 emas:
Shuning uchun:
chiqadi.
Bu tekshiruvning ma’nosi: ruxsat qiymatida yozish biti yoqilganmi?
& faqat ikkala qiymatda ham 1 bo‘lgan bitlarni qoldiradi.
Agar kerakli bit mavjud bo‘lmasa, natija 0 bo‘ladi.
8. Bitni o‘chirish
Bu misolda &^ operatori yordamida ma’lum bir flag o‘chiriladi.
package main
import "fmt"
func main() {
const yozish = 1 << 1
ruxsat := 0b111
ruxsat &^= yozish
fmt.Printf("%03b\n", ruxsat)
}
Boshlang‘ich qiymat:
yozish flagi:
Quyidagi yozuv:
aslida:
degani.
&^ operatori o‘ng operandda 1 bo‘lgan bitlarni chap operanddan tozalaydi.
Shuning uchun:
Natija:
Ya’ni o‘rtadagi bit o‘chirildi, qolgan bitlar esa o‘zgarishsiz qoldi.
9. Eksklyuziv OR bilan qiymatlarni almashtirish
Bu misol ^ operatori yordamida ikki butun son qiymatini vaqtinchalik o‘zgaruvchisiz almashtirish mumkinligini ko‘rsatadi.
Boshlanishida:
Birinchi amal:
aslida:
Keyingi amallar XOR xususiyatidan foydalanib eski qiymatlarni qayta tiklaydi va ularning joyini almashtiradi.
Oxirida:
Natija:
Bu misol ^ operatorining qiziqarli xususiyatini ko‘rsatadi.
Lekin amaliy Go kodida bu usul odatda tavsiya etilmaydi, chunki Go’da ancha tushunarli yozuv mavjud:
Bu variant qisqaroq, o‘qilishi osonroq va kodning maqsadini darhol ko‘rsatadi.
10. Ustuvorlikni qavs bilan aniqlashtirish
Bu misol operatorlar ustuvorligi va qavs yordamida hisoblash maqsadini aniq ko‘rsatishni namoyish qiladi.
package main
import "fmt"
func main() {
chegirma := 100_000 - (100_000*15)/100
fmt.Println(chegirma)
}
Bu yerda boshlang‘ich narx:
Chegirma:
Avval chegirma miqdori hisoblanadi:
Keyin:
Demak, chegirma miqdori:
Asosiy qiymatdan chegirmani ayiramiz:
Natija:
Qavs:
hisobning qaysi qismini birgalikda ko‘rish kerakligini aniqroq ko‘rsatadi.
100_000 ichidagi _ esa faqat sonni o‘qishni osonlashtiradi.
Quyidagi ikki yozuvning qiymati bir xil:
va:
Underscore _ sonning qiymatiga ta’sir qilmaydi. U katta sonlarni ko‘z bilan guruhlab o‘qishni qulaylashtiradi.