Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 9 - Přetypování a operátory v jazyce C

V minulé lekci, Výčtové typy v jazyce C, jsme využili znalosti binárních operací na výčtových typech.

V dnešním C tutoriálu se budeme věnovat operátorům a přetypování.

Priority operátorů

Z matematiky víme, že násobení a dělení má přednost před sčítáním a odčítáním. To je zcela běžné a očekávali bychom to i od programovacího jazyka. Ačkoliv se tento předpoklad zdá zcela běžný, nemusí nutně platit. Vše závisí na definici jazyka a na tom, jak je jazyk navrhnut. V C navíc máme vedle základních aritmetických operací další operace - logické, binární atd. Schválně jestli uhádnete, zda má přednost sčítání nebo modulo? A jak je na tom modulo s násobením? A budou se operace vyhodnocovat zprava nebo zleva?

Jazyk definuje tzv priority operátorů. Operátor s vyšší prioritou se vyhodnotí před operací s prioritou nižší. Nikoho asi nepřekvapí, že operace násobení má vyšší prioritu než operace sčítání. V následující tabulce jsou shrnuty všechny operace a jejich priorita (nižší číslo udává vyšší prioritu):

Priorita Operator Popis Směr vyhodnocení
1 ++ -- Postfix inkremencae a dekrementace Zleva doprava
() Volání funkce
[] Přístup k poli
. Přístup ke členům struktur a unionů
-> Přístup ke členům struktur a unionů ukazatelem
(typ){seznam} Implicitní vytvoření struktur (tzv. Compound literal)
2 ++ -- Prefix inkrementace a dekrementace Zprava doleva
+ - Označení znaménka (například int a = -4;)
! ~ Logický NOT a binární negace
(type) Přetypování
* Dereference ukazatele
& Získání adresy
sizeof operátor sizeof
_Alignof Požadavek na zarovnání (od C11)
3 * / % Násobení, dělení a modulo Zleva doprava
4 + - Sčítání a odčítání
5 << >> Bitový levý a pravý posun
6 < <= Porovnávací operátor menší (nebo rovno)
> >= Porovnávací operátor větší (nebo rovno)
7 == != Porovnávací operátor je rovno / není rovno
8 & Binární AND
9 ^ Binární XOR
10 | Binární OR
11 && Logický AND
12 || Logický OR
13 ?: Ternární operátor Zprava doleva
14 = Přiřazení
+= -= Přičtení (odečtení) a přiřazení
*= /= %= Vynásobení / vydělení / modulo a přiřazení
<<= >>= Binární posun a přiřazení
&= ^= |= Binární AND / XOR / OR a přiřazení
15 , Čárka Zleva doprava

Z tabulky by mělo být zřejmé, jak se operace vyhodnocují. Samozřejmě nikdo nebude chtít (snad jen na nějakých pohovorech), abyste si celou tabulku pamatovali. Je ale důležité vědět, že taková tabulka existuje (tzv. priorita operátorů) a že určuje způsob, jakým se v C vyhodnocuje. Jiné jazyky mohou mít tabulku jinou nebo mít nějakou modifikaci. Je dobré si před přechodem na jiný jazyk zjistit, jak se operátory vyhodnocují.

Chybí zde jeden důležitý operátor - závorky. Uzávorkování má nejvyšší prioritu a je vždy vyhodnoceno před zbylými operacemi. Doporučuji nespoléhat na prioritu operátorů a raději dávat do vyhodnocení závorky. Nejenže budete mít kontrolu nad vyhodnocováním operátorů, program se bude i mnohem lépe číst - hlavně pro lidi, kteří přijdou po vás.

Přetypování

Céčko zavádí pro přetypování velkou spoustu pravidel (ještě více než u operátor). Pokud by vás zajímalo více, můžete si informace dohledat v dokumentaci (v angličtině). Zde vypíchnu jen několik důležitých konstrukcí, které C používá.

V základu existují dva typy přetypování - explicitní a implicitní. Implicitní přetypování je takové, které probíhá automaticky. Jedná se o konverze z typu o menším rozsahu hodnot do typu o větším rozsahu hodnot. Graficky si můžeme implicitní konverze zobrazit jako jednosměrný řetěz, který udává, které konverze jsou 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, který je nahoře, se implicitně přetypuje na libovolný typ pod ním, je-li to potřeba.

Obráceným směrem probíhá tzv explicitní konverze. Kompilátoru musíme dodat informaci, že typ chceme skutečně přetypovat na typ menší. Máme-li ve větším typu příliš velké číslo, menší typ ho nemusí celé uložit. Ztratíme tím část informace - například při přetypování čísla z float do int se ztratí část čísla za desetinnou čárkou. Kompilátor chce mít jistotu, že jsme skutečně operaci požadovali a nejedná se o chybu. Přetypování napíšeme tak, že před výraz, který chceme přetypovat, napíšeme do závorky požadovaný typ. Pro příklad si napíšeme program pro výpočet průměru.

#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ýsledek:

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

Nejdříve přečteme všechny čísla. Protože průměr není celé číslo, musíme před samotným dělením čísla převést na typ double - v C vrací dělení dvou celých čísel vždy číslo celé. V tomto případě by stačilo přetypovat pouze jedno číslo (podle pravidel C), ale je vždy lepší explicitně říci, že se mají převést čísla obě - program se lépe čte. Také je v programu použito implicitní přetypování, při přičítání přečteného čísla (které je int) k sumě (která je unsigned int).

V příští lekci, Knihovny v jazyce C a C++, se naučíme vytvářet vlastní knihovny.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 14x (31.32 kB)
Aplikace je včetně zdrojových kódů v jazyce c

 

Předchozí článek
Výčtové typy v jazyce C
Všechny články v sekci
Pokročilé konstrukce jazyka C
Přeskočit článek
(nedoporučujeme)
Knihovny v jazyce C a C++
Článek pro vás napsal Patrik Valkovič
Avatar
Uživatelské hodnocení:
5 hlasů
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity