IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

9. diel - Pretypovania a operátormi

V minulej lekcii, Vymenované typy , sme využili znalosti binárnych operácií na vymenovaných typoch. V dnešnom C tutoriálu sa budeme venovať operátorom a pretypovanie.

Priority operátorov

Z matematiky vieme, že násobenie a delenie má prednosť pred sčítaním a odčítaním. To je úplne bežné a očakávali by sme to aj od programovacieho jazyka. Hoci sa tento predpoklad zdá úplne bežný, nemusí nutne platiť. Všetko závisí na určenie jazyka a na tom, ako je jazyk navrhnutý. VC navyše máme vedľa základných aritmetických operácií ďalšie operácie - logické, binárne atď. Schválne či uhádnete, či má prednosť sčítanie alebo modulo? A ako je na tom modulo s násobením? A budú sa operácie vyhodnocovať sprava alebo zľava?

Jazyk definuje tzv priority operátorov. Operátor s vyššou prioritou sa vyhodnotí pred operáciou s prioritou nižšou. Nikoho asi neprekvapí, že operácia násobenie má vyššiu prioritu ako operácia sčítanie. V nasledujúcej tabuľke sú zhrnuté všetky operácie a ich priorita (nižšie číslo udáva vyššiu prioritu):

priorita Operator popis smer vyhodnotenie
1 ++ -- Postfix inkremencae a dekrementace zľava doprava
() volanie funkcie
[] Prístup k poľu
. Prístup k členom štruktúr a Union
-> Prístup k členom štruktúr a Union ukazovateľom
(typ){seznam} Implicitné vytvorenie štruktúr (tzv. Compound Literal)
2 ++ -- Prefix inkrementácia a dekrementace sprava doľava
+ - Označenie znamienka (napríklad int a = -4;)
! ~ Logický NOT a binárne negácia
(type) pretypovanie
* dereferencia ukazovatele
& získanie adresy
sizeof operátor sizeof
_Alignof Požiadavka na zarovnanie (od C11)
3 * / % Násobenie, delenie a modulo zľava doprava
4 + - Sčítanie a odčítanie
5 << >> Bitový ľavý a pravý posun
6 < <= Porovnávací operátor menšie (alebo rovné)
> >= Porovnávací operátor väčšie (alebo rovné)
7 == != Porovnávací operátor je rovné / nerovná
8 & binárne AND
9 ^ binárne XOR
10 | binárne OR
11 && logický AND
12 || logický OR
13 ?: ternárne operátor sprava doľava
14 = Priradenie
+= -= Pripočítanie (odpočítaní) a priradenie
*= /= %= Vynásobení / vydelení / modulo a priradenie
<<= >>= Binárne posun a priradenie
&= ^= |= Binárne AND / XOR / OR a priradenie
15 , čiarka zľava doprava
Z tabuľky by malo byť zrejmé, ako sa operácia vyhodnocujú. Samozrejme nikto nebude chcieť (snáď len na nejakých pohovoroch), aby ste si celú tabuľku pamätali. Je ale dôležité vedieť, že takáto tabuľka existuje (tzv. Priorita operátorov) a že určuje spôsob, akým sa v C vyhodnocuje. Iné jazyky môžu mať tabuľku inú alebo mať nejakú modifikáciu. Je dobré si pred prechodom na iný jazyk zistiť, ako sa operátormi vyhodnocujú.

Chýba tu jeden dôležitý operátor - zátvorky. Zátvorkách má najvyššiu prioritu a je vždy vyhodnotené pred zvyšnými operáciami. Odporúčam nespoliehať na prioritu operátorov a radšej dávať do vyhodnotenia zátvorky. Nielenže budete mať kontrolu nad vyhodnocovaním operátorov, program sa bude aj oveľa lepšie čítať - hlavne pre ľudí, ktorí prídu po vás.

Pretypovanie

Céčko zavádza pre pretypovanie veľkú veľa pravidiel (ešte viac ako u operátor). Ak by vás zaujímalo viac, môžete si informácie dohľadať v dokumentácii (v angličtine). Tu vypichnem len niekoľko dôležitých konštrukcií, ktoré C používa.

V základe existujú dva typy pretypovanie - explicitné a implicitné. Implicitné pretypovanie je také, ktoré prebieha automaticky. Jedná sa o konverzie z typu o menšom rozsahu hodnôt do schválenia o väčšom rozsahu hodnôt. Graficky si môžeme implicitné konverzie zobraziť ako jednosmerný reťaz, ktorý udáva, ktoré konverzie sú možné.

char
unsigned char
short
unsigned short
int <=> enum
unsigned int
long
unsigned long
long long
unsigned long long
float
double
long double

Typ, ktorý je hore, sa implicitne přetypuje na ľubovoľný typ pod ním, ak je to potrebné.

Obráteným smerom prebieha tzv explicitné konverzie. Kompilátora musíme dodať informáciu, že typ chceme skutočne pretypovať na typ menšie. Ak máme vo väčšom type príliš veľké číslo, menšie typ ho nemusí celej uložiť. Stratíme tým časť informácie - napríklad pri pretypovanie čísla z float do int sa stratí časť čísla za desatinnou čiarkou. Kompilátor chce mať istotu, že sme skutočne operáciu požadovali a nejedná sa o chybu. Pretypovania napíšeme tak, že pred výraz, ktorý chceme pretypovať, napíšeme do zátvorky požadovaný typ. Pre príklad si napíšeme program pre výpočet priemeru.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char** argv)
{
    unsigned int suma = 0;
    unsigned int pocet = 0;
    int precteno;
    double prumer;

    printf("Zadejte cisla (zaporne cislo pro ukonceni): ");
    for (scanf("%d", &precteno); precteno >= 0 ; scanf(" %d", &precteno))
    {
        suma += precteno;
        pocet++;
    }

    prumer = (double) suma / (double) pocet;
    printf("Prumer je: %f", prumer);

    return (EXIT_SUCCESS);
}

výsledok:

VypocetPrumeru
Zadejte cisla (-1 pro ukonceni): 1 5 4 7 8 9 3 2 1 4 -1
Prumer je: 4.400000

Najskôr prečítame všetky čísla. Pretože priemer nie je celé číslo, musíme pred samotným delením čísla previesť na typ double - v C vracia delení dvoch celých čísel vždy číslo celé. V tomto prípade by stačilo pretypovať iba jedno číslo (podľa pravidiel C), ale je vždy lepšie explicitne povedať, že sa majú previesť čísla obe - program sa lepšie číta. Tiež je v programe použité implicitné pretypovanie, pri pričítanie prečítaného čísla (ktoré je int) k sume (ktorá je unsigned int).

V budúcej lekcii, Knižnice v jazyku C a C ++ , sa naučíme vytvárať vlastné knižnice.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 15x (31.32 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C

 

Predchádzajúci článok
Vymenované typy
Všetky články v sekcii
Pokročilé konštrukcia jazyka C
Preskočiť článok
(neodporúčame)
Knižnice v jazyku C a C ++
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity