9-mavzu: Ifodalar. Operand, amal, ifoda, amallarning ustuvorligi. Ifodalar yozish qoidalari. Reja

|
9-mavzu: Ifodalar. Operand, amal, ifoda, amallarning ustuvorligi. Ifodalar yozish qoidalari. Reja
|
bet | 1/5 | Sana | 26.06.2024 | Hajmi | 85,13 Kb. | | #265746 |
Bog'liq 9-mavzu. Ifodalar. Operand, amal, ifoda, amallarning ustuvorligi. Ifodalar yozish qoidalari.
9-mavzu: Ifodalar. Operand, amal, ifoda, amallarning ustuvorligi. Ifodalar yozish qoidalari.
Reja:
9.1. Ifodalar: operand, operatsiya, ifoda, amallarning ustuvorligi
9.2. Ifodalar yozish qoidalari. Standart matematik funktsiyalar
9.3. Ifodalar va amallar: arifmetik va mantiqiy. Ifodalar va amallarni yozish qoidalari
9.1. Ifodalar: operand, operatsiya, ifoda, amallarning ustuvorligi
Ifoda. Dasturning asosiy konstruktor qurilmasi ifoda hisoblanadi. Ifoda aniqlangan operandlar soni asosida qandaydir qiymatlarni hisoblaydi. Sodda ifodalar o’zida oddiy literal konstantalarni ifodalaydi, masalan, 'a', 3.14 yoki "Norah".
O’zgaruvchilar nomi ham ifoda hisoblanadi. O’zgaruvchi – bu nomga ega bo’lgan obyekt. Misol ko’ramiz.
// maydonni hisoblash:
int length = 20; // literal butun qiymat
// (o’zgaruvchini inisializasiyalash uchun foydalaniladi)
int width = 40;
int area = length*width; // ko’paytirish
Bu yerda length so’zi, o’zlashtiruvchi operator chap operandalarini belgilovchi “length nomli obyektni” anglatadi, shuning uchun bu ifoda quyidagicha o’qiladi: “length nomli obyektga 99 raqamini yozish”. O’zlashtiruvchi yoki inisializasiyalovchi operatorning chap qismida (u “length o’zgaruvchining lvalue” deb nomlanadi) va bu operatorlarning o’ng qismida (bu holatda u “length o’zgaruvchining rvalue”, “length nomli obyektning qiymati” yoki oddiy “length qiymati”) joylashgan length o’zgaruvchini ajratib olish kerak. Bu kontekstda nomlangan quti ko’rinishida o’zgaruvchilarni tasvirlash foydali.
Boshqacha aytganda, length – bu 99 tagacha qiymatni o’z ichiga oluvchi inttoifali obyekt nomi. Ba’zida length nomi (lvalue sifatida) qutiga, ba’zida esa (rvalue sifatida) – mana shu qutida saqlanayotgan qiymatning o’ziga tegishli bo’ladi.
+ va * operatorlari yordamida ifodalarni birlashtirib, quyida ko’rsatilganidek murakkabroq ifodalarni yaratishimiz mumkin. Ifodalarni guruhlash kerak bo’lganda qavslardan foydalanish mumkin.
int perimeter = (length+width)*2; // qo’shish va ko’paytirish
Qavssiz bu ifodani quyidagi ko’rinishda yozish mumkin:
int perimeter = length*2+width*2;
juda qo’pol va xatoliklarni keltirib chiqaradi.
int perimeter = length+width*2; // length bilan width*2 qo’shish
Oxirgi xatolik mantiqiy hisoblanadi va kompilyator uni topa olmaydi. Kompilyatoraniq ifodada inisializasiyalangan perimeter nomili o’zgaruvchini ko’radi. Agar ifoda natijasi ma’noga ega bo’lmasa, bu sizning muammoyingiz. Siz perimetrning matematik aniqliklarini bilasiz, kompilyator esa yo’q.
Dasturda operatorlar bajarilish tartibini aniq belgilaydigan, oddiy matematik qoidalardan foydalaniladi, shuning uchun length+width*2, length+(width*2) ni anglatadi. Shunga o’xshash a*b+c/d, a*(b+c)/d emas (a*b)+(c/d) ni anglatadi.
Qavsdan foydalanishning birinchi qoidasi shundaki: “Agar ikkilanayotgan bo’lsang qavsdan foydalan”. Umuman olganda dasturchi a*b+c/d formula qiymatida ikkilanmaslik uchun ifodalarni to’g’ri shakllantirishni o’rganishi kerak. Operatorlardan keng foydalanish, masalan(a*b)+(c/d) dastur o’qilishini susaytiradi.
Nima uchun biz o’qilishiga to’xtalib o’tdik? Chunki sizning kodingizni faqatgina siz emas, balki boshqa dasturchilar ham o’qishi mumkin, chalkashtirilgan kod o’qishni sekinlashtiradi va uning tahliliga to’sqinlik qiladi. Qo’pol kodni faqatgina o’qish emas, balki uni to’g’irlash ham qiyin bo’ladi. Yomon yozilgan kod odatda mantiqiy xatoliklarni berkitib turadi. Uning o’qilishida qancha ko’p kuch ketgan bo’lsa, o’zingizni va boshqalarni uning to’g’riligiga ishontirish shuncha qiyin bo’ladi. Juda ham qiyin bo’lgan ifodalarni yozmang va har doim ma’noli nomlarni tanlashga harakat qiling.
a*b+c/d*(e–f/g)/h+7 // juda qiyin
Binar arifmetik amallar bajarilganda turlarni keltirish quyidagi qoidalar asosida amalga oshiriladi:
short va char turlari int turiga keltiriladi;
Agar operandlardan biri long turiga tegishli bo’lsa ikkinchi operand ham long turiga keltiriladi va natija ham long turiga tegishli bo’ladi;
Agar operandlardan biri float turiga tegishli bo’lsa ikkinchi operand ham float turiga keltiriladi va natija ham float turiga tegishli bo’ladi;
Agar operandlardan biri double turiga tegishli bo’lsa ikkinchi operand ham double turiga keltiriladi va natija ham double turiga tegishli bo’ladi;
Agar operandlardan biri long double turiga tegishli bo’lsa ikkinchi operand ham long double turiga keltiriladi va natija ham long double turiga tegishli bo’ladi;
Agar ifodada short va int turidagi o’zgaruvchilar ishlatilsa, butun ifoda tiri int ga ko’tariladi. Agar ifodada biror o’zgaruvchi turi— long bo’lsa, butun ifoda turi long turga ko’tariladi. Ko’zda tutilganidek hamma butun konstantalar int turiga ega deb qaraladi. Hamma butun konstantalar oxirida L yoki 1 simvoli turgan bo’lsa, long turiga ega.
Agar ifoda float turidagi operandga ega bo’lsa, butun ifoda float turiga ko’tariladi. Agar biror operand double turiga ega bo’lsa, butun ifoda turi double turiga ko’tariladi.
Turlarni o’zgartirish amali quyidagi ko’rinishga ega:
(tur_nomi) operand;
Bu amal operandlar qiymatini ko’rsatilgan turga keltirish uchun ishlatiladi. Operand sifatida konstanta, o’zgaruvchi yoki qavslarga olingan ifoda kelishi mumkin. Misol uchun (long)6 amali konstanta qiymatini o’zgartirmagan holda operativ xotirada egallagan baytlar sonini oshiradi. Bu misolda konstanta turi o’zgarmagan bo’lsa, (double)6 yoki (float)6 amali konstanta ichki ko’rinishini ham o’zgartiradi. Katta butun sonlar haqiqiy turga keltirilganda sonning aniqligi yo’qolishi mumkin.
Masalan:
int x = 1.7+1.8;
int y = (int)1.7+(int)1.8;
Bu amallar bajarilishi natijasida x o’zgaruvchi qiymati 3 ga y o’zgaruvchi qiymati ikkiga teng bo’ladi.
sizeof amali operand sifatida ko’rsatilgan ob’ektning baytlarda xotiradagi hajmini hisoblash uchun ishlatiladi. Bu amalning ikki ko’rinishi mavjud:
sizeof ifoda sizeof (tur)
Shuni ta’kidlab o’tish lozimki sizeof funksiyasi preprosessor qayta ishlash jarayonida bajariladi, shuning uchun dastur bajarilish jarayonida vaqt talab etmaydi.
Misol uchun:
sizeof 3.14 = 8 sizeof 3.14f = 4
sizeof 3.14L = 10 sizeof(char) = 1
sizeof(double) = 8.
|
| |