Operační priorita

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 21. března 2017; kontroly vyžadují 3 úpravy .

Priorita , hodnost nebo seniorita operace nebo operátora  je formální vlastnost operátora/operace, která ovlivňuje pořadí jejího provádění ve výrazu s několika různými operátory bez výslovného (pomocí hranatých závorek) označení pořadí, ve kterém se provádí. jsou hodnoceny. Například operace násobení má obvykle vyšší prioritu než operace sčítání, takže výraz nejprve obdrží součin a a poté součet.

Operace mohou mít stejnou prioritu, v takovém případě jsou vyhodnoceny podle pravidla asociativity stanoveného pro tyto operace.

Ve formálních systémech existují dva způsoby, jak nastavit prioritu libovolného operátoru. První je rozdělení všech operátorů podle hierarchie priorit. Tato metoda se vždy používá k nastavení výchozích priorit a je pevně stanovena v popisu jazyka ve formě dohody, že těm a těm operátorům jsou přiděleny takové a takové priority. Nedostává žádný odraz v syntaxi jazyka, to znamená, že nepoužívá žádné explicitní prostředky (= ty / jiné symboly) k označení priority operace.

Druhá metoda umožňuje změnit výchozí priority jejich explicitním určením pomocí párových závorek. Hloubka vnoření je přitom přímo úměrná hodnotě priority, to znamená, že více vnitřních závorek označuje vyšší prioritu než ty vnější, které je rámují. V předchozím příkladu se součtem a součinem lze pořadí výpočtu změnit pomocí závorek a celý výraz zapsat takto: nebo takto: .

Praxe klasifikačních operací

V C++

Přednost operací je pořadí, ve kterém jsou operace prováděny ve výrazu, za předpokladu, že ve výrazu není explicitně uvedeno pořadí, ve kterém jsou operace prováděny (pomocí závorek).

Pokud mají operace stejnou prioritu, pak je pořadí provádění takových operací určeno podle vlastnosti asociativnosti.

Asociativita je směr provádění operací, pokud mají operace stejnou prioritu:

Priorita Úkon Asociativnost Popis
jeden :: zleva doprava operace rozlišení unárního rozsahu
[ ] operace indexování
() kulaté závorky
. přístup k členu struktury nebo třídy
-> přístup k členu struktury nebo třídy prostřednictvím ukazatele
2 ++ zleva doprava postfixový přírůstek
postfixový dekrement
3 ++ zprava doleva přírůstek předpony
předpona dekrementace
čtyři * zleva doprava násobení
/ divize
% zbytek divize
5 + zleva doprava přidání
odčítání
6 >> zleva doprava pravý posun
<< posun doleva
7 < zleva doprava méně
<= menší nebo rovno
> více
>= větší nebo rovno
osm == zleva doprava rovná se
!= ne rovné
9 && zleva doprava logické AND
deset || zleva doprava logické NEBO
jedenáct ?: zprava doleva podmíněná operace (ternární operace)
12 = zprava doleva úkol
*= násobení s přiřazením
/= rozdělení se zadáním
%= zbytek dělení se zadáním
+= doplnění se zadáním
-= odčítání s přiřazením
13 , zleva doprava čárka

V případě pochybností je třeba použít závorky. V některých případech může mít priorita operátorů implicitní účinky. Zvažte příklad:

int n = 5 ; cout << n += 3 ;

Navzdory samozřejmosti kódu pro člověka kompilátor vygeneruje chybu: ve výrazu na řádku 2 se nejprve provede operátor bitového posunu (<<). její priorita je 6 a je vyšší než priorita operátoru sčítání-přiřazení (+=) 12. V důsledku toho bude hodnota proměnné n předána proudu cout a operace += nebude provedeno.