C Ma’lumot turlari (tiplar)

C tiplashgan til hisoblanadi. Har bir obyektni hosil qilishda uning tipini e`lon qilish zarur (masalan butun son, haqiqiy son, forma, oyna, tugma(knopka), satr va boshqalar). Shu orqali kompilyator xatolardan holi bo`lishni, ya`ni o`zgaruvchi qabul qilishi mumkin bo`lgan qiymatlarni qabul qilishini ta`minlaydi. Obyekt tipi kompilyatorga obyekt o`lchamini (masalan int tipidagi obyekt xotiradan 4 bayt egallaydi), uning xususiyatlarini (masaslan forma ko`rinadigan va ko`rinmaydigan bo`lishi mumkin) ko`rsatadi.

Xuddi C++, C# va Java tillari kabi C da ham tiplar 2 guruhga ajratiladi: Oldindan aniqlangan tilning ichki tiplari va foydalanuvchi (dasturchi) tomonidan aniqlanadigan tiplar.

C# yana tiplarni 2 kategoriyaga bo`ladi: o`lchovli tiplar va ko`rsatqichli tiplar. Ular orasidagi asosiy farq qiymatlarini xotirada saqlash usuli. O`lchovli tiplar qiymatlarini stekda saqlanadi. Ko`rsatqichli tiplar obyektning faqat manzilini stekda, o`zini esa ko’chada saqlaydi. Ko’cha dasturning asosiy xotirasi hisolanadi. Ko’chaga murojaat qilish stekka murojaat qilishdan ko`ra sekin. Katta obyektlarni ko’chada saqlash ko`pgini imkoniyatlarga ega. Bu haqda keyinchalik to`xtalamiz.

Stek ma`lumotlar strukturasi. U elementarni “birinchi kelgan, oxirgi ketadi” prinsipi bo`yicha saqlaydi. Stek prosessor tomonidan qo`llab quvvatlanadigan xotira sohasiga tegishli. Unda lokal o`zgaruvchilar saqlanadi. Stekka murojaat umumiy xotira sohasiga murojaatga nisbatan bir necha marotaba tezroq. Shuning uchun ma`lumotlarni stekda saqlash dasturning ishlash tezligini oshiradi. C# da o`lchovli tiplar(masalan butun sonlar) qiymatini stekda saqlaydi va unga murojaat o`zgaruvchi nomi bilan amalga oshiriladi. Ko`rsatqichli tiplar ko’chada joylahadi. Ko’cha kompyuterning tezkor xotirasi. Unga murojaat stekka murojaatga nisbatan sekinroq. Agar obyekt ko’chada joylashgan bo`lsa, o`zgaruvchi uning faqat manzilini saqlaydi. Bu manzil stekda saqlanadi. Manzil orqali dastur obyektga murojaat qiladi. Stekda joylashgan har bir o`zgaruvchi ko`rinish sohasidan chiqqan zahoti “сборщик мусора” tomonidan o`chiriladi. Funksiya tanasida e`lon qilingan lokal o`zgaruvchilar runksiya ishini tugatishi bilan o`chiriladi. Ko’chada joylashgan obyektlar ham “сборщик мусора” tomonidan o`chiriladi. Bu obyektni ko`rsatib turgan barcha ko`rsatkichlar bilan obyekt orasidagi aloqa uzilganda amalga oshiriladi.

Avvaldan mavjud ichki tiplar

C tili CLS(Common Language Specification) ga mos keladigan keng tiplar to`plamini taqdim etadi. Bu tiplar NET platformasiga mos keladi yani C# da hosil qilingan obyektlar NET CLS qo`llab quvvatlaydigan har qanday dasturlash tilida foydalanish mumkin (masalan VB.NET). Har bir tip aniq o`zining o`zgarmas o`lchamiga ega. Quyida C tomonidan taqdim etilgan tiplar ro`yhati jadvalda keltirilgan:

Yuqoridagiga qo`shimcha tarzda C da yana enum, struct tipidagi obyektlar ham bor.

Turlar bilan ishlash

Turlarni keltirish. Turlarni keltirish (type casting) ma’lum turdagi o’zgaruvchi boshqa turdagi qiymat qabul qilganda foydalaniladi. Ba’zi turlar uchun keltirish avtomatik ravishda bajariladi. Avtomatik turlarni keltirish o’zgaruvchi turi hajmi qiymatni saqlashga yetarli bo’lganda bajariladi. Bu jarayon kengaytirish (widening) yoki yuksaltirish (promotion) deb ataladi, chunki, kichik razryadli tur katta razryadli turga kengaytiriladi. Bu holda turlarni avtomatik keltirish xavfsiz deb ataladi. Masalan int turi char turidagi qiymatni saqlashga yetarli, shuning uchun turlarni keltirish talab qilinmaydi. Teskari jarayon toraytirish (narrowing) deb ataladi, chunki qiymatni o’zgartirish talab etiladi. Bu holda turlarni avtomatik keltirish xavfli deb ataladi. Masalan haqiqiy turni butun turga keltirilganda kasr qism tashlab yuboriladi.

Amallarda turlarni avtomatik keltirish. 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;

Ifodalarda turlarni avtomatik keltirish. 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.

Turlar bilan ishlovchi amallar. 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 obyektning 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.

	sizeof 3.14 = 8
	sizeof 3.14f = 4
	sizeof 3.14L = 10
	sizeof(char) = 1
	sizeof(double) = 8