Přednost operátorů
 
Když se v jednom výrazu vyskytuje několik operací, je každá operace vyhodnocena a vyřešena v předem daném pořadí. Tento jev se nazývá přednost operací nebo priorita operátorů.

Pokud má ve výrazu operátor vyšší prioritu, je vyhodnocen před operátory s nižší prioritou.

Pokud mají operátory stejnou prioritu, pak jsou vyhodnocovány v pořadí, v jakém následují (jsou asociovány) za sebou. Asociativita může být zleva doprava nebo zprava doleva.

Zpravidla binární operátory (jako je +, ^) a unární příponové operátory (jako je (), ->) jsou vyhodnocovány zleva doprava a unární operátory předpon (například Not, @) jsou vyhodnocovány zprava doleva.

Operátory, které mají asociativitu "N/A" naznačují, že nelze odhadnout v jakém pořadí se budou operátory zpracovávat a je třeba zajistit pořadí zpracování, a to buď prioritně nebo asociativně. Funkcím podobné subjekty, jako je Cast, jsou vždy na prvním místě a jsou vyhodnoceny podle závorek vyžadovaných v jejich syntaxi. Jako poslední by měly být vyhodnoceny přiřazovací operátory.

K potlačení priority se dají využít závorky. Operace v závorkách jsou provedeny před dalšími operacemi. V rámci závorek platí běžně platné priority operátorů.

V následující tabulce jsou priority operátorů od nejvyšší k nejnižší. Mezery v tabulce oddělují skupiny operátorů, mající stejnou prioritu.

Výše priority

OperátorPoznámkaAsociativita
   
CASTTyp konverzeN/A
PROCPTRUkazatel proceduryN/A
STRPTRUkazatel řetězceN/A
VARPTRVariabilní ukazatelN/A
   
[]Index řetězceZleva doprava
[]Ukazatel indexuZleva doprava
()Index poleZleva doprava
()Volání funkceZleva doprava
.Přístup členuZleva doprava
->Ukazatel přístupu členuZleva doprava
   
@AdresaZprava doleva
*HodnotaZprava doleva
NewAlokace pamětiZprava doleva
DeleteDealokace pamětiZprava doleva
   
^ExponenciaceZleva doprava
   
-NegaceZprava doleva
   
*NásobeníZleva doprava
/DěleníZleva doprava
   
\Celočíselné děleníZleva doprava
   
MODZbytek po děleníZleva doprava
   
SHLPosun dolevaZleva doprava
SHRPosun dopravaZleva doprava
   
+SčítáníZleva doprava
-OdčítáníZleva doprava
   
&ZřetězeníZleva doprava
   
IsRun-time informace o kontrole typuN/A
   
=Rovná seZleva doprava
<>Nerovná seZleva doprava
<Menší nežZleva doprava
<=Menší nebo rovnoZleva doprava
>=Větší nebo rovnoZleva doprava
>Větší nežZleva doprava
   
NOTNegaceZprava doleva
   
ANDSpojení (a zároveň)Zleva doprava
   
ORNeboZleva doprava
   
EQVEkvivalence-rovnocennostZleva doprava
IMPImplikace-důsledekZleva doprava
XORVýhradní 'nebo'Zleva doprava
   
ANDALSOKonjunkce zkratky - A takéZleva doprava
ORELSEDisjunkce nevýhradní zkratky - Nebo jinakZleva doprava
   
=[>]PřiřazeníN/A
&=Zřetězit a přiřaditN/A
+=Přidat a přiřaditN/A
-=Odečíst a přiřaditN/A
*=Násobit a přiřaditN/A
/=Vydělit a přiřaditN/A
\=Celočíselně dělit a přiřaditN/A
^=Umocnit a přiřaditN/A
MOD=Přiřadit zbytek po děleníN/A
AND=Konjunkce a přiřazeníN/A
EQV=Ekvivalence a přiřazeníN/A
IMP=Implikace a přiřazeníN/A
OR=Včetně disjunkce a přiřaditN/A
XOR=Exkluzivní disjunkce a přiřaditN/A
SHL=Posunout doleva a přiřaditN/A
SHR=Posunout doprava a přiřaditN/A
LETPřiřazeníN/A
   
LET()PřiřazeníN/A


V některých případech může pořadí priorit způsobit matoucí nebo ne-intuitivní výsledky. Zde jsou některé příklady:
'' Vrátí opačný výsledek, tedy záporný
-2 ^ 2
Požadovaný výsledek: (-2) ^ 2 = 4
Skutečný výsledek:   -(2 ^ 2) = -4

'' netestuje proměnnou 'n'
n And 1  <>  0
Požadovaný výsledek: (n And 1) <> 0
Skutečný výsledek:   n And (1 <> 0)

'' chceme posunout řadu o n+1 bit
a Shl n+1
Požadovaný výsledek: a Shl (n + 1)
Skutečný výsledek: (a Shl n) + 1

Tam, kde není priorita výrazu zcela jednoznačná, je doporučeno, zabalit části výrazu do závorek, aby byla minimalizována možnost vzniku chyb. Také to napomáhá správnému přečtení a pochopení kódu programátory. Není od věci balit do závorek výrazy všechny, vždy a všude. Jde jen o zvyk, který ale dokáže ušetřit mnoho promrhaných hodin při hledání drobné chyby v obrovském kódu.

Viz též



Přeloženo: Gmisiycs 6.2.2016