Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement - sníží hodnotu proměnné o 1 a = 5; a++; // funguje jako a = a + 1; // v a je teď 6 Používají dvěma způsoby - jako prefix před názvem proměnné: ++i nebo --i - proměnná i je napřed zvýšena (snížena) o 1 a teprve následně se vykonná zbytek řádku - jako sufix za názvem proměnné: i++ nebo i-- - napřed se vykonná výpočet v řádku a teprve potom je proměnná i je zvýšena (snížena) o 1 Např.: int i = 5, j = 1, k; i++; // i bude 6 j = ++i; // i bude 7, j bude 7 j = 0; // vynulujeme j (bude 0), i zůstává 7 j = i++; // j bude 7 dle i a pak i bude 8 k = --j + 2; // j bude 6, potom +2 a k bude 8
k = j-- + 2; // j je 6, +2, k bude 8, j bude 5 Příkaz: k = --j + 2; Funguje takto: j = j 1; // nebo j--; nebo -j; k = j + 2; Příkaz: k = j-- + 2; Funguje takto: k = j + 2; j = j 1; // nebo j--; nebo -j; #include <stdio.h> int main(void) { int i; i = 5; printf("prefix: %d\n", ++i); i = 5; printf("postfix: %d\n", i++); printf("a ted i: %d\n", i); while(!kbhit()) ; return 0;
Základní binární operátory - sčítání + - odečítání - násobení * - reálné dělení / - celočíselné dělení / - dělení modulo % - zbytek po celočíselném dělení (např. 10%3 bude 1) Jak je to s tím dělením? - C to pozná podle datových typů operandů Tj.: int / int dělí celočíselně (např. 13 / 5 bude 2) int / float dělí reálně int / double dělí reálně float / int dělí reálně double / int dělí reálně atd. pro další typy (long, short jsou jako int, long double jako double) Pozor, toto je zdrojem častých chyb: double vysl, pi; pi = 3.1415; vysl = 4 / 3 * pi; 1 vysl bude 3.1415, protože 4 typu int / 3 typu int je 1 Správný zápis: double vysl, pi; pi = 3.1415; vysl = 4.0 / 3.0 * pi; // stačí 4/3.0 nebo 4.0/3 Stejná chyba: double vysl, pi; int a, b; a = 4; b = 3; pi = 3.1415; vysl = a / b * pi;
vysl bude 3.1415, protože a typu int / b typu int je 1 Přiřazovací operátor - v C vypadá takto = Upozornění: double a; a = 5; - nezpůsobí chybu, ale nutím program k převodu 5 typu int na 5.0 typu double. Zbytečně. Korektnější: double a; a = 5.0; l-hodnota = výraz; // hodnota nalevo od přiřazení Další operátory přiřazení += např. a += b * 3 + x znamená a = a + (b * 3 + x) -= totéž obdobně *= např. a *= b + 3 - x znamená a = a * (b + 3 - x) /= totéž obdobně %= totéž obdobně atd. totéž pro ostatní binární operátory (bez mezery) Např. v cyklu for pro určení jiného kroku než 1: for (i = 0; i < 100; i += 5) { příkazy; totéž jako: for (i = 0; i < 100; i = i + 5) { příkazy;
Booleovské operátory - C nezná logický datový typ, místo něj používá typ int (resp. celočíselné typy) - kladná čísla (nejčastěji 1) značí PRAVDA (TRUE) - nula (popř. záporná čísla) značí NEPRAVDA (FALSE) == - rovnost!= - nerovnost && - logický součin (AND, "a zároveň") - logický součet (OR, "nebo") Pozn.: if ((a < 5) && (a > 8)) v podstatě chyba!!!! tato podmínka je vždy 0, tj. nepravda, jak by mohlo být a menší než 5 a zároveň větší než 8 Je-li hodnota uvnitř intervalu otestuji správně takto: if ((a >= 5) && (a <= 8)) nebo if (!((a < 5) (a > 8))); Jednodušší příklad: if (x < 10) a totéž je (s negací): if (!(x >= 10))! - negace (NOT) např.: if (!(a < 5)) což je totéž jako if (a >= 5) < - menší než <= - menší nebo rovno > - větší než >= - větší nebo rovno
Chci vymezit obdélník v soustavě souřadnic: 4 y 2 5 x 9 Body o souřadnicích x a y test zda jsou uvnitř nebo na hranici: if (((x >= 5) && (x <= 9)) && ((y >= 2) && (y <= 4))) { printf("bod je uvnitř či na hranici obdelnika.\n"); Body o souřadnicích x a y test zda jsou vně obdélníka: if (!(((x >= 5) && (x <= 9)) && ((y >= 2) && (y <= 4)))) { printf("bod mimo obdelnik.\n"); Nebo (bez negace): if (((x < 5) (x > 9)) ((y < 2) (y > 4))) { printf("bod mimo obdelnik.\n");
Pozor: j = k = 5; - přiřazení, k bude 5, na místě přiřazení bude jako výsledek ta 5: j = 5; - ta se přiřadí do j a to bude tedy také 5 Lze též toto: x = sin(y = 2.34); - do y se přiřadí 2.34, to bude na místě přiřazení a x tedy bude sin(2.34) k == 5; - toto je porovnání, výsledek bude 0 nebo 1 (ve smyslu nepravda nebo pravda) např.: int jetotak, cislo; cislo = 5; jetotak = (cislo == 5); // do jetotak se ulozi 1 Zkrácené vyhodnocování logických výrazů - v C vždy! - pokud je výsledek podmínky jasný (0 && cokoliv), popř. (1 cokoliv) nepokračuje ve vyhodnocení dál (toho "cokoliv") a podmínka je vyhodnocena Pozor, možná úskalí zkráceného vyhodnocení: if ((a < 3) && (++i < 10)) {...nějaké příkazy... - bude dělat problémy (pokud to není záměr), protože: bude-li a >= 3, první podmínka je 0, druhá část podmínky se nebude vyhodnocovat a tím pádem ani operace ++i neproběhne. Totéž např.: if ((a < 3) && ((i = i + 5) < 10)) {...nějaké příkazy...
Toto lze i využít např.: - potřebuji ošetřit případ, kdy kolik může být i nula. A hrozí chyba dělení nulou: if ((kolik!= 0) && ((pocet / kolik) < 50) {...nějaké příkazy... - je-li kolik rovno 0, testování skončí u toho && a druhá část podmínky se nevyhodnotí k dělení nulou nedojde Ternární podmíněný operátor?: - má tři operandy Má tvar: podmínka? příkazy je-li podm.pravdivá : příkazy je-li podm. nepravdivá Např.: (i == 5)? i++ : j++; - je-li i rovno 5, vykoná se i++, jinak j++ totéž jako: if (i == 5) i++; else j++; Ternární operátor lze použít též takto: i = (j == 8)? 10 : 3; totéž jako: if (j == 8) i = 10; else i = 3; Např.: hledám-li maximum ze dvou hodnot: int a, b, max;... nějaké příkazy... max = (a > b)? a : b;
Tj. jako: int a, b, max;... nějaké příkazy... if (a > b) max = a; else max = b; Převod malých písmen na velká: int c; c = getchar(); c = ((c >= 'a') && (c <= 'z'))? c - ('a'-'a'):c;