9. díl - Přetypování a operátory

C++ Pokročilé konstrukce Přetypování a operátory

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?

Priority operátorů

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ýpočet průměru v C

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


 

Stáhnout

Staženo 0x (n/a)
Aplikace je včetně zdrojových kódů v jazyce c

 

  Aktivity (1)

Článek pro vás napsal patrik.valkovic
Avatar
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu.

Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!


 


Miniatura
Předchozí článek
Výčtové typy
Miniatura
Následující článek
Knihovny v jazyce C a C++

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!