Image
9.6.2016 0 Comments

C++ / Lexikálne jednotky / 3. časť

Späť na úvod >> Späť na programovanie >> Späť na seriál

Je tu apríl, vonku zúri jar (no, aspoň dúfam, keď to píšem, je ešte len február) a náš seriál sa po dvoch v podstate všeobecnovzdelávacích častiach konečne začína zaoberať jednotlivými kockami stavebnice s názvom C++. V poslednom odseku predchádzajúcej časti som veľmi optimisticky uviedol, čo všetko nás dnes čaká. Po intenzívnom zamyslení som sa však rozhodol začať celú stavebnicu skladať od tých najspodnejších vrstiev, lebo si myslím, že je to najvhodnejšia cesta k vybudovaniu solídnych znalostí o jazyku C++.

Doteraz sme si v skratke ukázali, ako taký jednoduchý program C++ vyzerá. Berte prosím tieto informácie ako prostriedok, o ktorý sa budeme neskôr opierať, aby ste vôbec boli schopní preberané konštrukcie v nejakom programe vyskúšať. V tejto a v nasledujúcich častiach preberieme (nie nevyhnutne v uvedenom poradí) lexikálne jednotky jazyka, typy premenných, konverzie medzi nimi, výrazy a operátory, príkazy, deklarácie a definície premenných a funkcií a iné. Potom si niečo povieme o štandardnej knižnici funkcií – čo je množina funkcií, ktoré už niekto za vás naprogramoval a dal vám k dispozícii spolu s prekladačom. Celá táto etapa seriálu bude pripomínať viac kurz jazyka C, ako som však už spomenul, budem tu vysvetľovať všetko okrem objektových čŕt C++. Po krátkej úvahe som sa rozhodol nevysvetľovať rozdiely medzi C a C++, myslím, že by vás to zbytočne plietlo, aj tak vás čaká informácií viac než dosť. V ukážkových programoch (skôr fragmentoch programov – maximálne zameraných na danú látku) budem používať funkcie štandardnej knižnice jazyka C (ak vôbec).

Napokon by som vás chcel ešte upozorniť na 32-bitový prekladač C/C++ s názvom DJGPP, na ktorý pre zmenu mňa upozornil jeden z čitateľov. Tento prekladač je šírený ako freeware a je dostupný na adrese http://www.delorie.com spolu s množstvom rôznych utilít, integrovaným prostredím a rôznymi knižnicami. Rozhodne je to zaujímavá a úplne funkčná alternatíva ku komerčným prekladačom, a ak sa mi podarí nájsť si chvíľu času na bližšie oboznámenie sa s týmto produktom, sľubujem, že budem o jeho existencii uvažovať v ukážkových programoch.

Lexikálne jednotky

Najprv by sme si mali hádam vysvetliť, čo vlastne je lexikálna jednotka. Lexikálna jednotka je základný stavebný prvok jazyka, a to nielen programovacieho, ale i bežného, ktorým hovoríme alebo píšeme (v tomto prípade je lexikálnou jednotkou slovo). Text v danom jazyku (pre programovací jazyk je textom program) je postupnosťou lexikálnych jednotiek (ktorá spĺňa určité pravidlá a pod., to nás teraz nezaujíma).

Jazyk C++ pozná 5 typov lexikálnych jednotiek (tokens): identifikátory, kľúčové slová, literály (konštanty), operátory a ostatné oddeľovače. Lexikálne jednotky v programe nemusia nasledovať tesne jedna za druhou (to by sa asi dosť ťažko čítalo), ale môžu byť oddelené tzv. bielymi znakmi (white space – tento názov vznikol z tlačenej reprezentácie bieleho znaku – na papieri sa nevytlačí nič, zostane len biela medzera). Bielymi znakmi v C++ sú medzera (space, kód ASCII = 32), horizontálny tabulátor (HT, 9), vertikálny tabulátor (VT, 11), znak návratu vozíka (carriage return – CR, 13), znak prechodu na nový riadok (new line – LF, 10), znak prechodu na novú stránku (form feed – FF, 12) a nakoniec tzv. komentár.

Komentár je vysvetľujúci text, ktorý napíšeme do zdrojového súboru napríklad na objasnenie nejakého úseku kódu, na opis argumentov funkcií a pod. Prekladač komentáre ignoruje. Komentáre sú určené jednak pre druhých programátorov, ktorí budú napríklad upravovať náš program, aby pochopili, o čo v ňom ide a ako sa to realizuje, a jednak pre nás, aby sme sa v programe vyznali aj po pol roku. Vo vlastnom záujme odporúčam komentovať všetko, čo by mohlo byť zdrojom nejasností.

Jazyk C++ rozlišuje medzi dvoma typmi komentárov. Prvý sa začína dvojicou znakov /*, po ktorej môžeme napísať náš komentárový text a celý blok ukončíme dvojicou znakov */. Medzi oboma dvojicami môžu byť ľubovoľné znaky (aj prechod na nový riadok), ktoré sú kompletne ignorované.

Druhý typ komentára sa začína dvojicou znakov // a končí sa znakom prechodu na nový riadok (teda všetko od // po koniec riadka je komentár). Ignorujú sa všetky ďalšie znaky na tom istom riadku.

Príklad:

 

/*

 * funkcia main()

 */

int main()

{

    ...

}

 

alebo

 

int main()

{

    // telo funkcie main()

}

 

Kurzívou zvýraznené časti sú považované za komentáre (editor integrovaného prostredia každého lepšieho prekladača ich dokáže odlíšiť farebne).

Prvý typ komentárov nemožno vnárať do seba (ako napr. /* /* vnútorný ­*/ vonkajší */), pretože po prvej dvojici /* sú nasledujúce znaky ignorované až po prvý výskyt */, po ktorom však v našom príklade nasleduje ešte dokončenie vonkajšieho komentára.

Identifikátory

Prvým typom lexikálnej jednotky sú identifikátory. Slúžia na pomenovanie rôznych prvkov programu, ako premenné, funkcie, návestia, a pod. Pravidlo na vytváranie identifikátorov je jednoduché – identifikátorom môže byť ľubovoľne dlhá postupnosť písmen a číslic, v ktorej prvým znakom však musí byť písmeno. Za písmeno sa považuje aj znak _ (podčiarknutie – underscore). Platnými identifikátormi teda sú napríklad x, _open, r1998, ale nie už napr. 2pi. V názvoch identifikátorov sa rozlišujú veľké a malé písmená, teda napr. aa, aA, Aa, AA sú štyri rôzne identifikátory.

Kľúčové slová

Kľúčové slová sú také reťazce znakov, ktoré sú určitým spôsobom vyhradené na použitie samotným jazykom a nesmú sa používať nijakým iným spôsobom. Ich zoznam nájdete v nápovednom systéme každého prekladača. Na ilustráciu slovo return, ktoré sme použili v prvom programe, je kľúčovým slovom a slúži na ukončenie funkcie a odovzdanie návratovej hodnoty. Jednotlivé kľúčové slová budeme preberať postupne pri príslušných témach.

Operátory a oddeľovače

Operátory sú špeciálne znaky, pomocou ktorých sa vyjadrujú určité operácie nad premennými a/alebo konštantami. Klasickým príkladom je operátor +, ktorého funkciou je sčítanie svojich argumentov. Ostatné oddeľovače sa používajú v rôznych špecifických prípadoch. Jeden príklad za všetky: jednotlivé príkazy sa v C++ oddeľujú znakom ; (bodkočiarka), obyčajne písaným za príkazom na konci riadka. Jednotlivé operátory si preberieme v časti venovanej výrazom, ostatné oddeľovače a ich funkcia vyplynú z kontextu.

Tabuľka 1

Escape sekvencia

ASCII znak

ASCII kód

Opis

\a

BEL

7

pípnutie

\b

BS

8

zmazanie posledného znaku (backspace)

\f

FF

12

nová stránka (form-feed)

\n

LF

10

nový riadok (line-feed)

\r

CR

13

návrat vozíka (carriage return)

\t

HT

9

horizontálny tabulátor

\v

VT

11

vertikálny tabulátor

\?

?

63

otáznik

\'

'

39

apostrof

\"

"

34

úvodzovky

\\

\

92

opačné lomítko (backslash)

\ooo

#ooo

ooo

znak s kódom ooo

\xhhh

#hhh

hhh

znak s kódom hhh

Literály

Slovník cudzích slov definuje pojem literál ako „konštantu, definovanú priamo svojou hodnotou“. To v preklade znamená, že napr. znak ? nie je literálom, ale reťazec 3.14159 áno. V ďalšom budem používať zrozumiteľnejší termín konštanta namiesto literál.

V jazyku C++ máme štyri typy konštánt: celočíselné, s pohyblivou rádovou čiarkou, znakové a reťazcové.

Celočíselná (integer) konštanta je postupnosť číslic. Ak sa táto postupnosť začína inou číslicou ako 0 a ďalej obsahuje číslice 0 ÷ 9, ide o desiatkovú konštantu (v desiatkovej sústave). Ak sa začína číslicou 0 a ďalej obsahuje číslice 0 ÷ 7, ide o oktálovú konštantu (v osmičkovej sústave). A nakoniec, ak sa začína dvojicou 0x alebo 0X a ďalej obsahuje číslice 0 ÷ 9 a znaky A ÷ F, a ÷ f, ide o hexadecimálnu konštantu (v šestnástkovej sústave). Všimnite si, že súčasťou konštanty nie je prípadné znamienko - (mínus)! Typ celočíselnej konštanty závisí od jej veľkosti, ale keďže typy C++ sme ešte nepreberali, vrátime sa k tejto téme neskôr.

Príklad: Vyjadríme číslo 3894 vo všetkých troch sústavách a zapíšeme príslušné konštanty.

desiatková – 3894 = (3894)10  3894

osmičková – 3894 = (7466)8  07466

šestnástková – 3894 = (F36)16  0xF36, 0XF36, 0xf36, 0Xf36

Konštanta s pohyblivou rádovou čiarkou (floating) sa skladá z celočíselnej časti, desatinnej bodky, desatinnej časti, znaku e alebo E a celočíselného exponentu s prípadným znamienkom. Ide, samozrejme, o zápis v tzv. vedeckej notácii, kde časť pred znakom E sa nazýva mantisa a časť za znakom E je exponent. Hodnota takto vyjadrenej konštanty je (mantisa × 10exponent). Celočíselná aj desatinná časť sú postupnosťami desiatkových číslic. Príkladom konštanty obsahujúcej všetky spomenuté polia je napr. 2.99E+8, čo je 2,99 × 108 (a aj rýchlosť svetla vo vákuu). Buď celočíselnú, alebo desatinnú časť (ale nie obe!) môžeme vynechať, t. j. .34E-5 aj 6.E+7 sú platné konštanty s pohyblivou rádovou čiarkou, ale .E+4 už nie. Ďalej buď desatinnú bodku alebo písmeno e/E s exponentom (ale opäť nie oboje) môžeme vynechať, tj. 5E-12 aj 3.14 sú platné konštanty s pohyblivou rádovou čiarkou, ale 765 už nie (to je totiž celočíselná konštanta). Znamienko pri exponente je povinné iba vtedy, ak je záporné (tj. miesto 2.99E+8 môžeme písať 2.99E8).

Znakovú (character) konštantu reprezentuje znak uzavretý v apostrofoch (') (v skutočnosti v apostrofoch môže byť aj viac znakov, vtedy ide o tzv. „širokoznakovú“ [wide-character] konštantu, ale tú teraz nebudeme brať do úvahy, azda snáď niekedy v budúcnosti). Príklady znakových konštánt sú '8', 'D', '#' a pod. Navyše sú v C++ definované tzv. escape sekvencie, ktoré slúžia na vyjadrenie inak nezapísateľných znakov. Tieto sekvencie sa začínajú znakom \ (backslash), ich zoznam je v tabuľke 1. Pomocou sekvencií \ooo a \xhhh môžeme zapísať ľubovoľný znak pomocou jeho hodnoty v kóde ASCII. Sekvencia \ooo opisuje znak pomocou oktálovej konštanty ooo (max. 3 číslice) nasledujúcej za znakom \. Sekvencia \xhhh opisuje znak pomocou hexadecimálnej konštanty hhh. Celá sekvencia reprezentuje jeden znak. Ako príklad si uvedieme zápis znaku S [kód ASCII = (83)10 = (123)8 = (53)16] vo všetkých tvaroch:

 

'S' = '\123' = '\x53'

 

V oboch typoch je sekvencia ukončená prvým neoktálovým, resp. nehexadecimálnym znakom.

Reťazcová konštanta je postupnosť znakov (resp. znakových konštánt bez apostrofov – možno používať aj escape sekvencie), uzavretá do úvodzoviek ("). Ak chceme v reťazci použiť úvodzovky ako znak, musíme pred ne napísať znak \. Ako si neskôr povieme, jazyk C++ nemá nijaký typ ‚reťazec znakov‘ a pre používanie reťazcových konštánt platia určité pravidlá – viac sa dozviete v časti venovanej typom C++. V pamäti je reťazcová konštanta uložená ako postupnosť znakov (lepšie povedané, bajtov s hodnotami reprezentujúcimi kódy ASCII jednotlivých znakov), ktorá je ukončená znakom '\0' (NUL), t. j. napríklad konštanta "Hello" je v pamäti uložená ako postupnosť znakov 'H', 'e', 'l', 'l', 'o', '\0'. Tento fakt je veľmi dôležitý a potrebný na porozumenie práce s reťazcami. Pre úplnosť ešte dodám, že ak sa v programe vyskytujú za sebou dve reťazcové konštanty, oddelené iba bielymi znakmi, prekladač ich spojí do jedinej, nespája však možné escape sekvencie. Teda napríklad zápis "\xA" "B" predstavuje reťazec dvoch znakov  '\xA', 'B', a nie jeden znak '\xAB'.

Nabudúce

To by bolo všetko o lexikálnych jednotkách. Ako tak pozerám, dnes to bude bez ukážkového programu, ale nesmúťte, nabudúce si to (dúfam) vynahradíme. Takto časť bola síce opäť trochu teoretická, ale ide o veľmi potrebnú kocku v úvode spomínanej stavebnice. Nabudúce sa konečne dostaneme k typom jazyka C++ a súčasne si povieme o typoch dnes preberaných konštánt. Domáca úloha sa nekoná, odporúčam vám iba prejsť si tento článok aj niekoľkokrát, kým nebudete mať jasno vo všetkom, čo sme prebrali. Prípadné nejasnosti rád zodpoviem elektronickou formou (len prosím o strpenie, ja určite odpoviem, hoci možno trochu oneskorene – závisí to od mojej zaneprázdnenosti).

C++

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá