LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> C/C++ (6) - Operátory

Pomocí 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.

3.11.2004 13:00 | Jan Němec | Články autora | přečteno 50090×

Operátory

Operá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.

PrioritaOperátoryAsociativita
1 .   ->   ()   []  zleva
2 +   -   ++   --   !   ~   (přetypování)   &   *   sizeofzprava
3 *   /   %zleva
4 +   -  zleva
5 <<   >>zleva
6 <   >   <=   >=zleva
7 ==   !=zleva
8 &zleva
9 ^zleva
10 |zleva
11 &&zleva
12 ||zleva
13 ?:zprava
14 =   +=   -=   *=   /=   %=   <<=   >>=   &=   |=   ^=   zprava
15 ,zleva

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.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář

9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business. Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář

12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář

16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář

18.6.2018 0:43 /František Kučera
Červnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 21. 6. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: F-Droid, aneb svobodný software do vašeho mobilu. Kromě toho budou k vidění i vývojové desky HiFive1 se svobodným/otevřeným čipem RISC-V.
Přidat komentář

23.5.2018 20:55 /Ondřej Čečák
Od pátku 25.5. proběhne na Fakultě informačních technologií ČVUT v Praze openSUSE Conference. Můžete se těšit na spostu zajímavých přednášek, workshopů a také na Release Party nového openSUSE leap 15.0. V na stejném místě proběhne v sobotu 26.5. i seminář o bezpečnosti CryptoFest.
Přidat komentář

20.5.2018 17:45 /Redakce Linuxsoft.cz
Ve čtvrtek 31. května 2018 připravuje webový magazín BusinessIT ve spolupráci s Best Online Média s.r.o. pátý ročník odborné konference Firemní informační systémy 2018. Akce proběhne v kongresovém centru Vavruška (palác Charitas), Karlovo náměstí 5, Praha 2 (u metra Karlovo náměstí) od 9:00 hod. dopoledne do cca 15 hod. odpoledne. Konference je zaměřena na efektivní využití firemních informačních systémů a na to, jak plně využít jejich potenciál. Podrobnější informace na webových stránkách konfrence.
Přidat komentář

14.5.2018 7:28 /František Kučera
Květnový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 17. 5. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát na téma: Audio – zvuk v GNU/Linuxu.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

20.9.2018 10:04 / Jan Ober
Jaký kurz a software by jste doporučili pro začínajcího kodéra?

20.9.2018 10:00 / Jan Ober
Re: Gimp

20.2.2018 18:48 / Ivan Majer
portal

20.2.2018 15:57 / Jan Havel
Jak využíváte služby cloudu v podnikání?

16.1.2018 1:08 / Ivan Pittner
verejna ip od o2 ubuntu

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2018) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze