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 tipaschar
- simbolio tipasint
- sveikojo skaičiaus tipaslong long
- didesnio sveikojo skaičiaus tipasfloat
- realiojo skaičiaus tipasdouble
- 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 atitikmuolong
- “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:
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:
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:
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:
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į:
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:
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
.