Ako môžeme uložiť nejakú hodnotu v jazyku C pre neskoršie použitie? Pre tento účel slúžia premenné, pomocou ktorých môžeme uložiť nejakú hodnotu ktorú chceme neskôr použiť, prípadne ak chceme uložiť nejaký výpočet a použiť ho viackrát bez toho, aby sme museli algoritmus výpočtu zakaždým opakovať.
Identifikátory v jazyku C
V jazyku C identifikátory predstavujú akúkoľvek premennú, konštantu, funkciu a jej parametre, typ, selektor, položku štruktúrovaných typov a podobne. Identifikátor je postupnosť písmen anglickej abecedy, arabských číslic a/alebo podčiarkovníka (_
).
Identifikátory nemôžu obsahovať medzere alebo iné špeciálne znaky, diakritiku a podobne - prípustné sú iba znaky ASCII kódu. Pre lepšiu čitateľnosť sa používa pre oddelenie viacslovných identifikátorov podľa konvencie podčiarkovník, napr.: toto_je_moja_premenna
(ale nikto nikomu neodtrhne hlavu, ak použije camelCase
alebo inú konvenciu pre názvy identifikátorov).
Ako identifikátor nie je možné použiť iba jedno z nasledujúcich kľúčových slov a nič iné (jedná sa o vyhradené slová pre kompilátor jazyka C):
auto enum short
break extern signed
case float sizeof
char for static
const goto struct
continue if switch
default inline typedef
do int union
double long unsigned
else register void
entry restrict volatile
for return while
Identifikátory premenných
Identifikátor premennej predstavuje jej názov - ako označíme naše dáta tak aby sme ich vedeli neskôr použiť? Pravidlá pre voľbu identifikátoru (názvu) pre premennú sú rovnaké ako všeobecné pravidlá vyššie.
Dátové typy
Ak chceme vytvoriť nejakú premennú v jazyku C, musíme najskôr poznať jej dátový typ. Je to spôsob, ktorý definuje ako je obsah premennej uložený v operačnej pamäti (RAM). Ak chceme napríklad uložiť hodnotu, ktorá reprezentuje pozíciu znaku v ASCII tabuľke, použijeme typ char
. Pre desatinné čísla použijeme float
, a podobne. Je dôležité vyberať správne dátové typy - napríklad, desatinné číslo nie je možné uložiť v pamäti ako celé číslo (s tým, že takéto číslo by sa dalo používať a robilo by to, čo očakávame).
Prehľad dátových typov
Medzi základné dátové typy patria:
Kľúčové slovo
pre definíciu |
Rozsah (vrátane) | Povoľuje negatívne hodnoty? | Koľko bitov zaberá v pamäti? | Využitie | |
---|---|---|---|---|---|
char
|
-128 až 127 | áno | 8 | Používame ho pre uchovávanie znakových hodnôt, pretože reprezentuje práve jeden znak v ASCII tabuľke (sám o sebe ale nepredstavuje reťazec viacerých znakov!). | |
unsigned char
|
0 až 255 | nie | 8 | Vo veľmi špecifických prípadoch (pozri nižšie). | |
short
|
-32 768 až
32 767 |
áno | 16 | V špecifických prípadoch, ak potrebujeme dodatočnú kontrolu nad využívaním pamäte RAM (napríklad, ak vyvíjame softvér pre prostredie s malým množstvom využiteľnej pamäte)[1]. | |
unsigned short
|
0 až 65 535 | nie | 16 | Vo veľmi špecifických prípadoch (pozri nižšie). | |
int
|
-2 147 483 648 až
2 147 483 647 |
áno | 32 | V prevažnej väčšine prípadov, keď chceme reprezentovať celočíselnú hodnotu (v aritmetických výpočtoch, pre indexy v cykloch a podobne). | |
unsigned int
|
0 až
4 294 967 295 |
nie | 32 | Vo veľmi špecifických prípadoch (pozri nižšie). | |
long long
|
-9 223 372 036 854 775 808 až
9 223 372 036 854 775 807 |
áno | 64 | Ak potrebujeme reprezentovať veľmi veľké čísla, kde je int nedostatočný.
Poznámka: zaberá 64 bitov, na 32-bitových systémoch sa "zlepia" dve 32-bitové adresy dokopy. |
|
unsigned long long
|
0 až
18 446 744 073 709 551 615 |
nie | 64 | Vo veľmi špecifických prípadoch (pozri nižšie).
Poznámka: zaberá 64 bitov, na 32-bitových systémoch sa "zlepia" dve 32-bitové adresy dokopy. |
|
float
|
-3.4 × 1038 až 3.4 × 1038 | áno | 32 | Ak potrebujeme vo všeobecnosti uložiť nejaké desatinné číslo. | |
double
|
-1.7 × 10308 až 1.7 × 10308 | áno | 64 | Ak potrebujeme uložiť desatinné číslo, na ktoré float nepostačuje.
Poznámka: zaberá 64 bitov, na 32-bitových systémoch sa "zlepia" dve 32-bitové adresy dokopy. |
Kedy použiť signed
alebo unsigned
?
Hlavný rozdiel medzi signed
a unsigned
číslami je v tom, že signed
čísla môžu byť negatívne (< 0), ale unsigned
nemôžu. Pomenovanie pochádza (samozrejme) z angličtiny, kde sa znamienko negácie označuje ako "negation sign" - samotné znamienko je "sign", a teda premenné ktoré sú signed
by sa dali preložiť ako "oznamienkované" (so znamienkom).
Umožňujú uloženie čísiel v väčším rozsahom, pretože bit ktorý získame navyše namiesto znamienka sa použije pre zväčšenie rozsahu (keďže môžeme kombinovať jeden bit navyše, a tým pádom uložiť väčšie čísla). Nevýhoda ale je, že počet využitých bitov v pamäti sa neredukuje a vo všeobecnosti iba zamieňame väčší rozsah s možnosťou ukladať negatívne čísla (teda, nemôžme ich použiť s úmyslom znížiť pamäť, ktorú náš program používa). Nie sú taktiež vhodné pre indexy, ako by sa na prvý pohľad mohlo zdať[2].
Sú preto vhodné iba v niekoľkých špecifických prípadoch:
- ak pracujeme s bitmi a bitovými operáciami
- ak sme zúfalí a potrebujeme vyšší rozsah pre uloženie nášho čísla
- ak využívame ich vlastnosti v iných špecifických prípadoch, napríklad v kryptografii, atď...
V skratke, je lepšie o nich moc nepremýšľať pretože v kontexte bežných programovacích problémov nie sú výhodné a benefity ktoré poskytujú sú zatienené ich slabými stránkami.
boolean
?
A kde je boolean
?
Premenná typu boolean
nie je v jazyku C definovaná. Namiesto toho sa pre reprezentáciu hodnôt pravda a nepravda používajú celočíselné konštanty 0
a 1
.
Typ bool
si môže definovať používateľ sám alebo zahrnúť hlavičkový súbor <stdbool.h>
- ale o tom neskôr. Dovtedy budeme používať nuly a jednotky, tak ako to C od nás očakáva :)