====== Základní operátory ====== R-hodnota (viz. dříve) se může skládat z více prvků s vlastnostmi r-hodnoty. To uděláme za pomoci nějakých operátorů, se dvěmi hodnotami můžeme provádět různé operace (aritmetické, logické a další). k tomu nám slouží různé operátory. ===== Příklad ===== int x, a, b = 2; x = (a = (b * 2) - 3); Na konci tohoto kódu budou proměnné "x" a "a" držet hodnotu 1. Z toho také vyplívá, že celé přiřazení (l-hodnota = r-hodnota) je zároveň r-hodnotou a lze ho přiřadit do jiné l-hodnoty (např. proměnné). Také si všimněme, že lze použít závorky () k seskupování výrazů a úpravě jejich priorit (víme, že násobení má přednost před sčítáním), tato základní asociativita funguje stejně jako v matematice, pokud si nejsme jisti, nemusíme experimentovat a prostě se pojistíme závorkou. ===== Přehled operátorů ===== Zde naleznete seznam různých operátorů. Některé z nich budeme používat a vysvětlíme si je, ale většinu z nich zatím potřebovat nebudeme, ale k tomuto seznamu se určitě budete potřebovat vracet. + sčítání - odčítání * násobení / dělení % dělení modulo (zbytek po dělení) ++, -- inkrementace resp. dekrementace hodnoty, prefixový i postfixový zápis = *= /= %= += -= <<= >>= &= |= ^= jednoduché přiřazení a přiřazení s výpočtem < menší než > větší než <= menší nebo rovno >= větší nebo rovno == rovnost != nerovnost && logický součin (and) || logický součet (or) ! logická negace ~ bitová negace <<, >> bitový posun vlevo resp. vpravo & bitový součin (and) | bitový součet (or) ^ bitový vylučovací (exkluzivní) součet (xor) ?: podmíněné vyhodnocení zprava doleva . tečka, přímý přístup ke členu struktury -> nepřímý přístup ke členu struktury , čárka, oddělení výrazů sizeof získání velikosti objektu v bytech (typ) přetypování na typ uvedený v závorkách & reference (získání adresy objektu) * dereference (získání objektu dle adresy) ===== Porovnávání ===== V kapitole, kde budeme probírat podmínky a cykly určitě využijeme porovnávací operátory (<,>,<=,>=,==,!=), logickou negaci (!) a logický součin a součet (&&,||). Pokud jde o porovnávací operátory, tak vždy vrací hodnotu true (1 nebo jiná nenulová hodnota), nebo false (0), tj. pravda/nepravda. Logický součin (&&) vrací true pouze pokud jsou obě hodnoty true. Pokud je první hodnota false, tak se druhá nevyhodnocuje (zjednodusene vyhodnocovani). Logický součet (||) vrací true pokud je alespoň jedna z hodnot true. Pokud je první hodnota true, tak se druhá nevyhodnocuje (zjednodusene vyhodnocovani). Logická negace vrací opak (!1 je 0, !0 je 1). ===== Příklady ===== int a = 2, b = 3, x = 4, y = 2; b = !(b == a); //b bude true b = (b != a); //b bude true (jde o prakticky jiny zapis stejneho vypoctu) b = (a = 2); //casta chyba - nedojde k porovnani, ale prirazeni 2 do a a nasledne do b x = (x <= y); //x bude false y = !((1 <= 2)||(b = 7)); //y bude false, prirazeni 7 do b neprobehne (pouzito zjednodusene vyhodnocovani) y = 128; //y bude true y = 0; //y bude false y = !y; //y bude true ===== Inkrementace, dekrementace,... ===== Hodnotu proměnné můžeme změnit i jiným způsobem, než je přiřazení: int a = 31, b; a++; //a bude zvětšena o 1 (jiný zápis: a = a+1; ) a *= 2; //a bude vynásobeno 2 (jiný zápis: a = a*2; ) b = a++; //a bude přiřazeno do b a následně zvětšeno o 1 b = --a; //a bude zmenšeno o 1 a nasledne prirazeno do b ===== Operátor sizeof() ===== sizeof je makro preprocesoru, které nám vrátí velikost daného datového typu (viz. kapitola jednoduché datové typy) v bytech. Víme, že například celé číslo (int) zabírá v paměti většinou 2 byty, výraz sizeof(int) nám tedy vrátí u většiny kompilátorů číslo 2. ===== Samostatné cvičení ===== * Vymyslete přiřazení co nejsložitějšího výrazu, jehož výsledkem bude hodnota false. * Jakou hodnotu bude mít následující výraz: * (((!(1 > 2 || 2 > 1)) * 2 + 4) / 2) == 7