Tipai

C++ tipai

Šis skyrius skirtas susipažinti su C++ kalboje egzistuojančiais kintamųjų tipais bei apžvelgti jų skirtumus ir ypatumus.

Kas yra tipas?

Įvairiems kintamiesiems galima priskirti įvairias reikšmes. Šios reikšmės būna įvairių tipų - skaičiai, simboliai, loginės reikšmės ir pan. C++ kalboje lygiai taip pat tipus turi ir kintamieji. Kintamojo tipas iš esmės pasako, kokio tipo reikšmę tas kintamasis gali saugoti. Taigi, jei turime kintamąjį, kurio tipas yra skaičius, tai jame tikrai negalėsime saugoti teksto ar pan.

Kokie yra galimi tipai C++ kalboje?

Pagrindiniai C++ kalbos palaikomi tipai yra šie:

  • bool - loginis tipas
  • char - simbolio tipas
  • int - sveikojo skaičiaus tipas
  • long long - didesnio sveikojo skaičiaus tipas
  • float - realiojo skaičiaus tipas
  • double - dvigubas realiojo skaičiaus tipas

Taip pat kai kuriuos tipus galima praplėsti naudojant šiuos papildomus raktinius žodžius:

  • signed - tipas su ženklu (reikšmė gali būti teigiama arba neigiama)
  • unsigned - tipas be ženklo (reikšmė visada neneigiama)
  • short - “mažesnis” tipo atitikmuo
  • long - “didesnis” tipo atitikmuo

Į šiuos papildomus raktinius žodžius (bent kol kas) nekreipsime per daug dėmesio.

Smulkiau apžvelkime aukščiau išvardintus pagrindinius tipus.

Loginiai kintamieji

Loginiai kintamieji žymimi naudojant tipą bool. Jų galimos reikšmės vos dvi - true bei false. Kodo pavyzdys:

bool loginis = true;
bool apverstas = !loginis; // paneigiame kintamojo "loginis" reikšmę, tad kintamasis "apverstas" laiko reikšmę false

Simboliai

Kintamieji, laikantys vieną simbolį, žymimi tipu char. Į tokius kintamuosius galima įrašyti tik simbolius. Simboliai C++ kalboje rašomi naudojant viengubas kabutes. Kodo pavyzdys:

char simbolis = 'a';
char skaitmuo = '2'; // atkreipkite dėmesį, kad čia ne skaičius 2, o simbolis '2'

Sveikieji skaičiai

Kintamieji, laikantys sveikuosius skaičius, žymimi tipais int, long long bei kitais išvestiniais tipais, gaunamais pasitelkus aukščiau minėtus modifikatorius. C++ sveikojo skaičiaus tipas turi vieną labai rimtą ribojimą - jame negalima laikyti bet kokio dydžio sveikųjų skaičių (nemažai kitų programavimo kalbų, pvz. Python, tokią galimybę turi). Čia ir prasideda “galvos skausmas” - kada naudoti int, o kada long long ar kitą atitikmenį? Apie tai pakalbėsime žemiau.

Sveikųjų skaičių tipų naudojimo kodo pavyzdys:

int sveikas = 100;
long long didelisSveikas = 1000000000000000000LL; // prierašas "LL" informuoja kompiliatorių, kad šį skaičių reikia laikyti long long tipo, o ne int.

Realieji skaičiai

Kintamieji, laikantys realiuosius skaičius, žymimi tipais float, double ar atitikmenimis. Skirtumas tarp šių tipų toks pats, kaip ir tarp int bei long long - laikomų reikšmių rėžiai. Kodo pavyzdys:

float realus = 1.5f; // prierašas "f" informuoja kompiliatorių, kad čia yra float tipo skaičius
double tikslesnisRealus = 3.141592653589;

Kintamųjų rėžiai

Kaip jau buvo užsiminta, C++ kalba šiek tiek apriboja tai, kokias reikšmes galima rašyti į kintamuosius. Tarkime, realiojo skaičiaus tipuose galime laikyti skaičius tik iki tam tikro tikslumo. T.y. jei, tarkime, kintamasis palaikytų 10 ženklų tikslumą, o mes norėtume įrašyti į jį reikšmę 12 ženklų tikslumu, paskutiniai 2 ženklai būtų tiesiog “nukerpami”, nes netilptų į C++ apibrėžtus 10 ženklų rėmus.

Tam tikrus rėžius turi visi C++ tipai, tačiau čia panagrinėsime tik sveikuosius bei realiuosius skaičius, nes būtent šie tipai būna dažniausiai nauojami ir kelia didžiausią galvos skausmą.

Tipas Minimali reikšmė Maksimali reikšmė
int
long long
float
double

Atrodytų, kad realiųjų skaičių tipų rėžiai yra be galo dideli, bet yra viena bėda - šie tipai gali laikyti tik labai nedidelį reikšminių skaitmenų kiekį (float - iki 7, double - iki 15). Reikšminiai skaitmenys - tai visi skaičiaus skaitmenys, atmetus prieky ir gale esančius nulius. Taigi akivaizdu, kad 7 ar 15 skaitmenų tikslumas nėra toks jau geras, kokio norėtume.

Beveik visais atvejais galioja vienas geras patarimas: jei galite kažkaip išsiversti vien su sveikaisiais skaičias - būtinai taip ir darykite. Realiuosius skaičius naudokite tik tada, kai kitos išeities tikrai nėra. Na o kurį sveikojo skaičiaus tipą pasirinkti? Paprastai, jei esate įsitikinę, kad reikšmės moduliu niekada neviršys maždaug , tai galima naudoti int tipą, na o jei reikšmės gali siekti net - naudokite long long.

Overflow

Tikriausiai pažiūrėjus į aukščiau esančią lentelę kyla klausimas, kas atsitiks, jei bandysime “išlipti” iš šių nustatytų rėžių. Imkime tokį kodo pavyzdį:

int x = 2147483647;
x = x + 1;

Logiškai mąstant, kintamojo x reikšmė įvykdžius šį kodą turėtų būti lygi 2147483648, tačiau tai nebetelpa į aprašytus rėžius. Tad kas čia įvyksta? Tokiu atveju, kai atliekant skaičiavimus (ar tiesiog nuskaitant / įrašant reikšmes) yra “išlipama” iš tipo rėžių, įvyksta taip vadinamas “perpildymas” (angl. overflow). Kintamojo reikšmė tarsi “apsiverčia” ir pradeda vėl skaičiuoti nuo kito rėžių galo. Šiuo konkrečiu atveju, x kintamojo reikšmė taptų lygi -2147483648, nes perviršis virš rėžio 2147483647 tiesiog “grąžina” kintamojo reikšmę į kitą galą.

Tipų konvertavimas

Programuojant dažnai būna taip, kad norime vieno tipo kintamuosius paversti kito tipo kintamaisiais. Tai yra įmanoma, tačiau atliekant vertimus reikia būti atsargiems, nes galima įvelti klaidų ir padaryti, kad programa nebesikompiliuotų.

Štai kodo pavyzdys, kaip int tipo kintamąjį galima paversti float tipo kintamuoju:

int sveikasSkaicius = 123;
float realusSkaicius = (float)sveikasSkaicius; // realusSkaicius laiko reikšmę, lygią 123.0

Atkreipkite dėmesį į žymėjimą (float)sveikasSkaicius. Čia dalis skliaustuose nusako, į kokio tipo reikšmę paversti kintamajame sveikasSkaicius esančia reikšmę.

Tokie tipų vertimai, kaip šiame pavyzdyje, dažniausiai naudojami, kai norime pereiti iš skaičiavimo su sveikaisiais skaičiais, į skaičiavimą realiaisiais skaičiais. Pavyzdžiui, jei toliau programoje norime turimą skaičių 123 padalinti iš dviejų, tai tą darant int tipo kintamajame gautume atsakymą 61, nes dalinant du sveikuosius skaičius gaunamas sveikas skaičius, o jei pereiname į float ar double kintamąjį, tai atsakymas jau būtų 61.5.