Operátory v jazyce C a C++

09-Operátory

Výraz je konstrukce předepisující výpočet hodnoty. Je tvořen operandy a operátory. Operand je proměnná, zápis funkce nebo složitější konstrukce mající opět hodnotu (tedy zase výraz). Operátory určují, co provést s hodnotami operandů. Jazyk C++ nabízí celou řadu unárních a binárních operátorů a jeden operátor ternární (operátory s jedním, dvěma a třemi operandy). Unární operátory jsou zpravidla prefixové (zapisují se před operand) nebo postfixové (píší se za operand). Binární operátory jsou nejčastěji infixové (píší se mezi operandy).

Rozdělení

  PINK (2 dělení)
  podle počtu operandů
   a++ (1 operand) unární
   a+b (2 operandy) binární
   ternární
  
  
  podle funkce
   aritmetické
   porovnávací
   logické
   inkrementace, dekrementace
   přiřazovací
  
  a++
  ++a 
   
  a*=5+c
  vezme jako
  a*=(5+c)
  

Operátor určuje operaci, která se má s operandem nebo operandy provést. Mohou být unární (1 operand) nebo binární (2 operandy).

Aritmetické operátory

Unární operátory:

Ternární

Operátor podmíněného výrazu ?:

Syntax:
podmínka ? podmínka_splněna : podmínka_nesplněna
Význam v zápisu

E1 ? E2 : E3

se operand E1 automaticky konvertuje na typ bool. Je-li hodnota E1 rovna true, je výsledkem E2, jinak je výsledkem E3. V případě tohoto operátoru C++ zaručuje, že se jako první vyhodnotí operand E1 a teprve pak E2 nebo E3 (vždy jen jeden z nich).
Pro typ výsledku platí:

Poznámka:
Tento operátor se nepovažuje za jediný symbol, můžeme ho rozdělit bílými znaky.

Priorita operátorů

 
  určuje pořadí zpracování
  největší - závorka
  nejmenší - čárka
  
  neučit se tabulku prioritu
  
  tabulka MAK sem
  

Prioritu označíme čísly od 1 (nejvyšší) do 16 (nejnižší). Dříve se vyhodnocují pochopitelné operátory s vyšší prioritou, pořadí ale můžeme upravit kulatými závorkami. Asociativita určuje, zda se zřetězené operátory vyhodnocují v pořadí zprava doleva nebo zleva doprava. Napříkal operátor sčítání + je asociativní zleva doprava, a to znamená, že výraz:

a + b + c

se vyhodnotí jako

(a + b) + c

Jak jistě víte, jsou situace, kdy pro sčítání na počítači neplatí asociativní zákon, a proto je důležité vědět, jak zpracování takovéhoto výrazu proběhne. Některé operátory, například přiřazovací, jsou asociativní zprava doleva. Výraz:

a = b = 3.1;

se vyhodnotí jako

a = (b = 3.1);

Proměnné a se přiřadí výsledek operace b = 3.1, tedy hodnota uložená v b.
Pozor: C++ sice předepisuje, v jakém pořadí se vyhodnotí operace, ale nestanoví pořadí, ve kterém se připraví operandy. Jestliže napíšeme

f() + g() + h()

máme sice zaručeno, že se hodnoty, vrácené těmito funkcemi, sečtou v pořadí

(f() + g()) + h()

ale to neznamená, že se funkce f(), g() a h() budou také v tomto pořadí volat. Jestliže to bude překladač pokládat za vhodné (třeba kvůli optimalizaci), může nejprve zavolat funkci g(). výsledek si uložit, pak zavolat třeba h(), výsledek si opět uložit, a nakonec zavolat f (). Tyto dílčí výsledky ovšem musí sečíst v pořadí určeném asociativitou použitých operátorů.

V následující tabulce P znamená prioritu, A asociativitu, je v C říká, zda lze tento operátor používat i v jazyce C, a sloupec l-hodnota říká, zda daný operátor vytváří l-hodnotu.
Operátory, které se skládají z více znaků, nesmíme při zápisu rozdělit, tj. mezi jednotlivé znaky tvořící operátor nesmíme vložit bílé znaky. Výjimkou jsou operátory (), [] a :?.