ARCHIV |
|||||||||||||||||||||||||||||||||||||||||||||||||||||
Software (10844)
Distribuce (131)
Skripty (697)
Menu
Diskuze
Informace
|
C/C++ (6) - OperátoryPomocí operátorů lze v Céčku nejen sečíst nebo vynásobit dvě čísla, ale třeba i zavolat funkci, zvětšit hodnotu proměnné o 1 nebo získat velikost výrazu. OperátoryOperátory zná každý z výrazů v matematice. Intuitivně: operátor vezme nějaký počet operandů (nejčastěji dva) a z jejich hodnot vypočítá další hodnotu, která je výsledkem výrazu. Pokud má výraz více operátorů, pořadí vyhodnocování určuje priorita, asociativita a závorky. 1 + 2 * 3 znamená 1 + (2 * 3) a ne (1 + 2) * 3 (* má vyšší prioritu než +) 1 - 1 - 1 znamená (1 - 1) - 1 a ne 1 - (1 - 1) (- je asociativní zprava) V Céčku je to podobné, jen s několika výhradami. Operátorem zde je téměř cokoli od aritmetických operátorů přes přiřazení, predikátové symboly, spojky z výrokové logiky až po operátor zapomenutí a dokonce i volání funkce. Narozdíl od matematiky mají některé operátory vedlejší efekt, například změní hodnotu operandu po vypočtení výrazu. Z operátorů lze vytvořit složitý výraz. V obecném případě norma jazyka nezaručuje pořadí vyhodnocování podvýrazů ani to, že celý strom výrazu bude vyhodnocen. Například u exp1 + exp2 se nelze spolehnout na to, že bude exp1 vyhodnocen před exp2 a v případě exp1 * exp2 nemusí být jeden z výrazů vyhodnocen vůbec (pokud ten druhý vyjde nula). U jednoduchých podvýrazů exp1 a exp2 programátorovi na pořadí vyhodnocení nezáleží, ale pokud podvýrazy například obsahují volání funkcí s nějakým vedlejším efektem, může být pořadí důležité. V tom případě musí programátor výraz rozepsat do dvou příkazů. Některé operátory naopak pořadí vyhodnocování přesně specifikují, ale jedná se spíše o výjimky, na které vždy upozorním. V souvislosti s operátory se vyskytuje pojem l-hodnota. Je to výraz, který označuje nějaké místo v paměti, kam můžeme zapisovat. Nejčastější l-hodnotou je proměnná, naopak konstanta l-hodnotou není. Zhruba řečeno, l-hodnota je cokoli, co může být na levé straně přiřazení. Jazyk C má 15 priorit operátorů, menší číslo znamená vyšší prioritu. Ani zkušený programátor obvykle nezná přesně priority jednotlivých operátorů, proto se je dobrým zvykem u složitějších výrazů hodně používat závorky.
Něteré operátory už známe. Z první skupiny je to volání funkce, operátor (). Prvním operandem je ukazatel na funkci (v našem případě to byl zatím vždy, název funkce, ale to je v Céčku vlastně konstantní ukazatel do kódu programu v paměti), případnými dalšími operandy jsou parametry funkce. V druhé skupině jsme se setkali s přetypováním. Známe i operátor sizeof, ten má syntaxi podobnou volání funkce s jedním parametrem a spočítá velikost výrazu nebo i typu v paměti. printf("int má %i byty a celočíselná konstanta také %i\n", sizeof(int), sizeof(5)); Ve třetí a osmé skupině jsou operátory * a &, dereference ukazatele a adresa, známe také ve 14. skupině =. Rovnítko, operátor přiřazení, používáme především kvůli jeho vedlejšímu efektu (do levého operandu se přiřadí hodnota pravého), ale občas se hodí i jeho návratová hodnota, kterou je pravý operand. i = j = k = 0;
Díky asociativitě zprava se výraz vyhodnotí jako i = (j = (k = 0));
a jediným příkazem jsme tak vynulovali tři proměnné. Nejprve se do k uložila 0, hodnotou výrazu k = 0 je 0, která se tak dostane i do j a stejným způsobem nakonec i do proměnné i. Nejznámějšími operátory jsou ty aritmetické. Ve druhé skupině jsou unární + a -, například +5 nebo -128 a ve třetí *, / a %. Hvězdičkou se násobí, lomítkem dělí a procento je zbytek po celočíselném dělení. Je důležité vědět, že / je jak celočíselné, tak i reálné dělení. Je-li alespoň jeden z operandů reálného typu, použije se dělení reálné, v opačném případě celočíselné. Chceme-li reálně dělit dvě celá čísla, je třeba použít přetypování nebo za konstantou explicitně uvést desetinnou tečku. int i = 7, j = 2; double f; f = 7 / 2; printf("%f\n", f); /* 3.000000 nepříjemné překvapení ? */ f = 7 / 2.0; printf("%f\n", f); /* 3.500000 */ f = i / j; printf("%f\n", f); /* 3.000000 nepříjemné překvapení ? */ f = i / (double) j; printf("%f\n", f); /* 3.500000 */ V programech se často vyskytují konstrukce typu i = i + 1 nebo i = i * 2, tedy kombinace přiřazení s jedním dalším operátorem, kde levým operandem přiřazení i aritmetického operátoru je jedna a ta samá proměnná. Céčko zde programátorům ulehčuje život a nabízí sadu operátorů ze 14. skupiny. Místo i = i + 1 tak lze psát i += 1, místo i = i * 2 píšeme i *= 2 a podobně. Úplně nejčastěji se používá zvětšení nebo zmenšení o jedničku. Zápis i += 1 nebo i -= 1 by se někomu mohl zdát stále moc dlouhý, proto C nabízí operátory ++ a --. Místo i = i + 1 lze psát i += 1 nebo také i++, případně ++i. Výraz i = i - 1 zcela analogicky nahradíme i -= 1 nebo i--, případně --i. Mezi prefixovou a postfixovou verzí operátorů ++ a -- je následující rozdíl: ++i nejprve zvětší proměnnou i o jedničku a výsledná hodnota i je návratovou hodnotou celého výrazu. Naopak u i++ je návratovou hodnotou původní i. int i = 5; printf("%i\n", i++); /* 5 */ /* v i je teď 6 */ printf("%i\n", ++i); /* 7 */ Pokračování příštěV příštím díle probereme logické operátory a dostaneme se k podmínce.
Související články
Předchozí Celou kategorii (seriál) Další
C/C++ (1) - Úvod
C/C++ (2) - První program C/C++ (3) - Proměnné a konstanty C/C++ (4) - Funkce printf C/C++ (5) - Funkce printf podruhé C/C++ (7) - Podmínka C/C++ (8) - Cykly C/C++ (9) - Pole C/C++ (10) - Standardní vstup a výstup C/C++ (11) - Čtení a konverze čísel C/C++ (12) - Preprocesor C/C++ (13) - Preprocesor podruhé C/C++ (14) - Funkce C/C++ (15) - Proměnné C/C++ (16) - Hlavičkové soubory C/C++ (17) - Makefile C/C++ (18) - Makefile podruhé C/C++ (19) - Příkaz switch a bitové operátory C/C++ (20) - Alokace paměti C/C++ (21) - Práce s řetězci C/C++ (22) - Struktury C/C++ (23) - Seznam C/C++ (24) - Soubory C/C++ (25) - Funkce s proměnným počtem parametrů C/C++ (26) - Standardní knihovna C/C++ (27) - Standardní knihovna podruhé C/C++ (28) - Standardní knihovna potřetí C/C++ (29) - Standardní knihovna počtvrté C/C++ (30) - Výčtový typ a nestandardní knihovny C/C++ (31) - Jazyk C++, historie, charakteristika, vztah k C C/C++ (32) - Omezení C++ oproti C C/C++ (33) - Rozdíly mezi C a C++ C/C++ (34) - Drobná vylepšení C++ C/C++ (35) - Reference, funkce C/C++ (36) - Prostory jmen C/C++ (37) - Prostory jmen podruhé C/C++ (38) - Prostory jmen potřetí C/C++ (39) - Objektově orientované programování C/C++ (40) - Dědičnost a virtuální metody GCC vs. CLANG C++ Binární vyhledávací stromy C++ Datová struktura zásobník C++ - Hashování C++ - Vyhledávání v textu - Brute Force algoritmus C++ šablony Grafy a grafové algoritmy I Grafy a grafové algoritmy II C++ výjimky C++ Funktory neboli funkční objekty Grafy a grafové algoritmy III. C++ a garbage collector Předchozí Celou kategorii (seriál) Další
|
Vyhledávání software
Vyhledávání článků
28.11.2018 23:56 /František Kučera 12.11.2018 21:28 /Redakce Linuxsoft.cz 6.11.2018 2:04 /František Kučera 4.10.2018 21:30 /Ondřej Čečák 18.9.2018 23:30 /František Kučera 9.9.2018 14:15 /Redakce Linuxsoft.cz 12.8.2018 16:58 /František Kučera 16.7.2018 1:05 /František Kučera
Poslední diskuze
31.7.2023 14:13 /
Linda Graham 30.11.2022 9:32 /
Kyle McDermott 13.12.2018 10:57 /
Jan Mareš 2.12.2018 23:56 /
František Kučera 5.10.2018 17:12 /
Jakub Kuljovsky | |||||||||||||||||||||||||||||||||||||||||||||||||||
ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2024) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze |