Dasturlash II


Laboratoriya ishi №:2 Tiplarni almashtirish operatorlari


Download 297.3 Kb.
bet4/13
Sana07.03.2023
Hajmi297.3 Kb.
#1246573
1   2   3   4   5   6   7   8   9   ...   13
Bog'liq
Дастурлаш 2 Лаборатория иши 2021 (4)

Laboratoriya ishi №:2 Tiplarni almashtirish operatorlari.


Ishning maqsadi:
Kerakli jixoz va vositalar: Kompyuter, proyektor
Nazariy ma’lumot.
C++ tilida beshta tipni almashtirish operatorlari mavjud.
Agar siz bir ma'lumot turidan ikkinchisiga, kattaroq (hajmi/diapazonda) o'zgartirishni xohlasangiz, yashirin konvertatsiya qilish yaxshi tanlovdir.
Ammo ko'plab yangi dasturchilar ko'pincha quyidagi kabi narsalarni qilishga harakat qilishadi: float x = 11/3 ;. Biroq, 11 va 3 butun sonlar bo'lgani uchun hech qanday sonli kengayish sodir bo'lmaydi. 11/3 butun songa bo'linish amalga oshiriladi, buning natijasida 3 qiymati paydo bo'ladi, keyin esa bilvosita 3.0 ga aylantiriladi va x o'zgaruvchisiga tayinlanadi!
Literallardan (masalan, 11 yoki 3) foydalansangiz, bitta yoki ikkala butun sonni suzuvchi nuqta qiymatiga (11,0 yoki 3,0) almashtirish ikkala operandni ham suzuvchi nuqta qiymatlariga aylantiradi va suzuvchi nuqtani bajaradi. bo'linish.
Ammo o'zgaruvchilardan foydalansangiz nima bo'ladi? Masalan:
int i1 = 11;
int i2 = 3;
float x = i1 / i2;
1
2
3
int i1 = 11;
int i2 = 3;
float x = i1 / i2;

X ning qiymati 3 ga teng. Kompilyatorga butun sonlar bo‘linmasi o‘rniga suzuvchi nuqta bo‘linmasidan foydalanmoqchi ekanligimizni qanday aytamiz? To'g'ri! Kompilyatorga aniq konvertatsiya qilishni ko'rsatma berish uchun aniq ma'lumotlar turini o'zgartirish operatorlaridan foydalaning.


Aniq ma'lumotlar turini o'zgartirish operatorlari
C++ da aniq turdagi konvertatsiya operatsiyalarining 5 turi mavjud:
C-uslubini konvertatsiya qilish;
static_cast operatoridan foydalanish;
const_cast operatoridan foydalanish;
dynamic_cast operatoridan foydalanish;
reinterpret_cast operatoridan foydalanish.
Ushbu darsda biz C uslubidagi konvertatsiya va static_cast operatorini ko'rib chiqamiz. Ko‘rsatkichlar va merosga o‘tganimizda dynamic_cast operatorini ko‘rib chiqamiz. const_cast va reinterpret_cast operatorlaridan foydalanishga yo'l qo'ymaslik kerak, chunki ular kamdan-kam hollarda foydalidir va noto'g'ri ishlatilsa, muammoli bo'lishi mumkin.
Qoida: Agar jiddiy sabab boʻlmasa, const_cast va reinterpret_cast dan foydalanmang.
C uslubini aylantirish
C dasturlashda ma'lumotlar turini aniq konvertatsiya qilish () operatori yordamida amalga oshiriladi. Qavslar ichiga konvertatsiya qilinadigan turni yozamiz. Ushbu turdagi konvertatsiya C uslubidagi konvertatsiya deb ataladi. Masalan:
int i1 = 11;
int i2 = 3;
float x = (float)i1 / i2;
int i1 = 11;
int i2 = 3;
float x = (float)i1 / i2;

Yuqoridagi dasturda biz qavslar yordamida kompilyatorga i1 (int tipidagi) o'zgaruvchini floatga aylantirishni aytamiz. i1 floatga aylanganligi sababli, i2 avtomatik ravishda floatga aylantiriladi va suzuvchi nuqta bo'linishi amalga oshiriladi!


C++ tili ushbu operatordan quyidagi tarzda foydalanishga ham imkon beradi:
int i1 = 11;
int i2 = 3;
float x = float(i1) / i2;
int i1 = 11;
int i2 = 3;
float x = float(i1) / i2;

C uslubidagi konvertatsiya kompilyator tomonidan kompilyatsiya vaqtida tekshirilmaydi, shuning uchun uni, masalan, const turlarini konvertatsiya qilishda yoki ma'lumotlar turlarini ularning diapazonlarini hisobga olmasdan o'zgartirganda (to'lib ketishiga olib kelishi mumkin) noto'g'ri foydalanish mumkin.


Shuning uchun, C uslubidagi konvertatsiyadan foydalanmaslik yaxshiroqdir.
Qoida: C uslubidagi konvertatsiyadan foydalanmang.
Static_cast operatori
C ++ da yana bir aniq ma'lumotlar turini o'zgartirish operatori mavjud - static_cast operatori. Avvalroq, char belgilar turi haqidagi darsda biz allaqachon static_cast operatoridan char tipidagi o‘zgaruvchini int turiga o‘tkazish uchun ishlatgan edik, bunda belgi o‘rniga butun son chiqarildi:
char c = 97;
std :: cout << static_cast (c) << std :: endl; // natija "a" emas, 97 bo'ladi
char c = 97;
std :: cout << static_cast (c) << std :: endl; // natija "a" emas, 97 bo'ladi
static_cast operatori asosiy ma'lumotlar turini boshqasiga aylantirish uchun eng yaxshi qo'llaniladi:
int i1 = 11;
int i2 = 3;
float x = static_cast(i1) / i2;
int i1 = 11;
int i2 = 3;
float x = static_cast(i1) / i2;

Static_cast operatorining asosiy afzalligi shundaki, u kompilyatsiya vaqtida kompilyator tomonidan tekshiriladi, bu esa kutilmagan muammolar yuzaga kelishini qiyinlashtiradi.


Yashirin konvertatsiya qilishda aniq konversiya operatorlaridan foydalanish
Agar siz ma'lumotlar turlari bo'yicha xavfli yashirin konvertatsiya qilsangiz, kompilyator shikoyat qiladi. Masalan:
int i = 49;
char ch = i; // yashirin konvertatsiya
int i = 49;
char ch = i; // yashirin konvertatsiya

int (4 bayt) tipidagi o‘zgaruvchini char turiga (1 bayt) o‘zgartirish potentsial xavflidir – kompilyator ogohlantirish beradi. Siz ataylab potentsial xavfli ishni qilyapsiz (lekin baribir buni qilishni xohlaysiz) haqida unga xabar berish uchun static_cast iborasidan foydalaning:


int i = 49;
char ch = static_cast (i);
int i = 49;
char ch = static_cast (i);
Quyidagi holatda kompilyator double turidan int turiga o'tkazish ma'lumotlar yo'qolishiga olib kelishi mumkinligidan shikoyat qiladi:
int i = 90;
i = i / 3,6;
int i = 90;
i = i / 3,6;
Kompilyatorga buni ataylab qilishni xohlayotganimizni aytish uchun:
int i = 90;
i = static_cast (i / 3.6);
int i = 90;
i = static_cast (i / 3.6);
Xulosa
Iloji bo'lsa, ma'lumotlar turini o'zgartirishdan qochish kerak, chunki bunday o'zgarishlar qachon amalga oshirilsa, kutilmagan muammolar yuzaga kelishi mumkin. Ammo ko'pincha buni oldini olish mumkin bo'lmagan holatlar mavjud. Shuning uchun, bunday hollarda C uslubidagi konvertatsiya o'rniga static_cast operatoridan foydalangan ma'qul.

Download 297.3 Kb.

Do'stlaringiz bilan baham:
1   2   3   4   5   6   7   8   9   ...   13




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling