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 |
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