kichik-teng <= x<=y x kichik yoki teng y ga ==, !=, >= va <= operatorlarni yozganda oraga bo'sh joy qo'yib ketish sintaksis hatodir. Yani kompilyator dasturdagi hatoni ko'rsatib beradi va uni tuzatilishini talab qiladi. Ushbu ikki belgili operatorlarning belgilarining joyini almashtirish, masalan <= ni =< qilib yozish ko'p hollarda sintaksis hatolarga olib keladi. Gohida esa != ni =! deb yozganda sintaksis hato vujudga ham, bu mantiqiy hato bo'ladi. Mantiqiy hatolarni kompilyator topa olmaydi. Lekin ular programma ishlash mantig'ini o'zgartirib yuboradi. Bu kabi hatolarni topish esa ancha mashaqqatli ishdir (! operatori mantiqiy inkordir). Yana boshqa hatolardan biri tenglik operatori (==) va tenglashtirish, qiymat berish operatorlarini (=) bir-biri bilan almashtirib qo'yishdir. Bu ham juda ayanchli oqibatlarga olib keladi, chunki ushbu hato aksariyat hollarda mantiq hatolariga olib keladi.
Yuqoridagi solishtirish operatorlarini ishlatadigan bir dasturni ko'raylik.
//Mantiqiy solishtirish operatorlari
# include int main() { int s1, s2; cout << "Ikki son kiriting: " << endl; cin >> s1 >> s2; //Ikki son olindi. if (s1 == s2) cout << s1 << " teng " << s2 << " ga" << endl; if (s1 < s2) cout << s1 << " kichik " << s2 << " dan" << endl; if (s1 >= s2) cout << s1 << " katta yoki teng " << s2 << " ga" << endl; if (s1 != s2) cout << s1 << " teng emas " << s2 << " ga" << endl; return (0); } Ekranda: Ikki sonni kiriting: 74 33 74 katta yoki teng 33 ga 74 teng emas 33 ga Bu yerda bizga yangi bu C++ ning if (agar) struktura-sidir. if ifodasi ma'lum bir shartning to'g'ri (true) yoki noto'g'ri (false)bo'lishiga qarab, dasturning u yoki bu blokini bajarishga imkon beradi. Agar shart to'g'ri bo'lsa, if dan so'ng keluvchi amal bajariladi. Agar shart bajarilmasa, u holda if tanasidagi ifoda bajarilmay, if dan so'ng keluvchi ifodalar ijrosi davom ettiriladi. Bu strukturaning ko'rinishi quyidagichadir:
if (shart) ifoda;
Shart qismi qavs ichida bo'lishi majburiydir.Eng ohirida keluvchi nuqta-vergul (;) shart qismidan keyin qo'yilsa ( if (shart); ifoda; ) mantiq hatosi vujudga keladi. Chunki bunda if tanasi bo'sh qoladi. Ifoda qismi esa shartning to'g'ri-noto'g'ri bo'lishiga qaramay ijro qilaveradi.
C++ da bitta ifodani qo'yish mumkin bo'lgan joyga ifodalar guruhini ham qo'yish mumkin. Bu guruhni {} qavslar ichida yozish kerak. if da bu bunday bo'ladi:
if (shart) {
ifoda1;
ifoda2;
...
ifodaN;
}
Agar shart to'g'ri javobni bersa, ifodalar guruhi bajariladi, aksi taqdirda blokni yopuvchi qavslardan keyingi ifodalardan dastur ijrosi davom ettiriladi.
YANGI STILDAGI E'LON FAYLLARI VA ISMLAR SOHASI TUSHUNCHASI C++ ning standarti .h bilan tugaydigan (stdio.h ...) standart kutubhona e'lon fayllarini yangittan nomlab chiqdi. Bunda .h qo'shimchasi olib tashlandi.
C dan qolgan fayllar ismiga esa c harfi qo'shildi.
Misol uchun:
iostream.h -> iostream
string.h -> cstring
stdlib.h -> cstdlib
time.h -> ctime
C dan meros qolgan kutubhona 18 ta e'lon fayli orqali berilgan. C++ ga tegishli standart kutubhonada esa 32 ta e'lon fayl bor. Fayllarni yangittan belgilashdan maqsad kutubhodadagi funksiya va ob'ektlarni std deb ataluvchi ismlar sohasiga (namespace) kiritishdir.
Ismlar sohasining o'zi ham nisbatan yangi tushuncha. Ismlar sohasini alohida dastur qismlari deb faraz qilsak boladi. Boshqa-boshqa sohalarda ayni ismli funksiya, o'zgaruvchi nomlari va ob'ektlar berilishi mumkin. Va bunda hech qanday ismlar to'qnashuvi sodir bo'lmaydi. Misol uchun bizda global, std va fun::obj degan ism sohalari bo'lsin. Ularning har birining ichida esa cout nomli ob'ekt aniqlangan bo'lsin. C++ da to'liq aniqlangan ism (fully qualified name) degan tushuncha bor. Shunga ko'ra har bir cout ob'ektinig to'liq ismi quyidagicha bo'ladi:
Ismlar sohasi ob'ekt
global ::cout
std std::cout
fun::obj fun::obj::cout
:: operatori sohalarni bog'lash uchun qo'llaniladi. fun::obj nomli ismlar sohasida obj fun ichida joylashgan ism sohasidir. Global ismlar sohasida aniqlangan funksiya va boshqa turdagi dastur birliklariga programmaning
istalgan yeridan yetishsa bo'ladi. Masalan global ismlar sohasida e'lon qilingan int tipidagi k ismli o'zgaruvchimiz bol'sa, uning ustidan dasturning hohlagan blokida amal bajarsak bo'ladi.
Ismlar sohasi mehanizmi dasturchilarga yangi kutubhonalarni yozish ishini ancha osonlashtiradi. Chunki yangi kutubhonada ayni ismlar qo'llanishiga qaramay, ismlar konflikti yuz bermaydi. Dastur yoki kutubhona yozganda yangi ismlar sohasini belgilash uchun namespace istalgan_ism {
...
foo();
int k;
String str;
...
}
deb yozamiz. Dasturimizda ushbu ismlar sohasida aniqlangan o'zgaruvchilarni ishlatish uchun ularning to'liq ismini yozishimiz kerak.
Masalan:
istalgan_ism::foo();
Ammo bu usul ancha mashaqqatli bo'ladi. Har bir funksiya yoki o'zgaruvchi oldiga uning to'liq aniqlangan ismini yozish ko'p vaqt oladi. Buning o'rniga biz
using namespace istalgan_ism;
deb yozib o'tsak kifoya. using (ishlatish, qo'llash) buyrug'i bizning ismlar sohamizni dasturimiz ichiga tanishtiradi. Eng asosiysi biz bu amalni sohada aniqlangan va biz qo'llamoqchi bo'lgan ismlarning ilk chaqirig'idan oldin yozishimiz kerak. C++ ning standart kutubhonasida aniqlangan ifodalarni qo'llash uchun biz
using namespace std; deymiz. Va albatta qo'llanilayotgan e'lon fayllari yangi tipda bo'lishi kerak. Endi bu tushunchalarni ishlatadigan bir dasturni keltiraylik.
//Yangi tipdagi e'lon fayllari va ismlar sohasini qo'llash.