Egy művelet vagy operátor prioritása , rangja vagy rangja egy operátor/művelet olyan formális tulajdonsága, amely befolyásolja a végrehajtás sorrendjét egy kifejezésben több különböző operátorral, ha nincs kifejezett (zárójelben) jelzés a sorrendre vonatkozóan. értékelik. Például a szorzási művelet általában magasabb prioritást kap, mint az összeadás, így a kifejezés először a és a szorzatot kapja , majd az összeget.
A műveletek azonos prioritásúak lehetnek, ebben az esetben az ezekre a műveletekre létrehozott asszociativitási szabály szerint kerülnek kiértékelésre.
Formális rendszerekben kétféleképpen lehet beállítani bármely operátor elsőbbségét . Az első az összes operátor elosztása a prioritási hierarchia szerint. Ez a módszer mindig az alapértelmezett prioritások beállítására szolgál, és a nyelvi leírásban rögzítésre kerül egy megállapodás formájában, hogy ilyen és ilyen operátorokhoz ilyen és ilyen prioritásokat rendelnek. Nem kap semmilyen tükrözést a nyelv szintaxisában, azaz nem használ semmilyen kifejezett eszközt (= azokat / egyéb szimbólumokat) a művelet prioritásának jelzésére.
A második módszer lehetővé teszi az alapértelmezett prioritások megváltoztatását azáltal, hogy kifejezetten megadja azokat párosított zárójeles karakterekkel. Ugyanakkor a beágyazási mélység egyenesen arányos a prioritás értékével, vagyis több belső zárójel magasabb prioritást jelez, mint az azokat keretező külső. Az előző példában az összeggel és a szorzattal a számítás sorrendje zárójelekkel módosítható, a teljes kifejezést így írva: vagy így: .
A műveletek prioritása a műveletek végrehajtásának sorrendje a kifejezésben, feltéve, hogy nincs kifejezett jelzés a műveletek végrehajtási sorrendjéről a kifejezésben (zárójelek használatával).
Ha a műveletek prioritása azonos, akkor az ilyen műveletek végrehajtási sorrendjét az asszociativitás tulajdonsága határozza meg.
Az asszociativitás a műveletek végrehajtásának iránya, ha a műveletek prioritása azonos:
Prioritás | Művelet | Az asszociativitás | Leírás |
---|---|---|---|
egy | :: | balról jobbra | egységes hatókörű felbontási művelet |
[ ] | indexelési művelet | ||
() | kerek zárójelek | ||
. | struktúra vagy osztály tagjának elérése | ||
-> | struktúra vagy osztály tagjának elérése mutatón keresztül | ||
2 | ++ | balról jobbra | postfix növekmény |
— | postfix csökkenés | ||
3 | ++ | jobbról balra | előtag növekménye |
— | előtag csökkenése | ||
négy | * | balról jobbra | szorzás |
/ | osztály | ||
% | az osztály többi része | ||
5 | + | balról jobbra | kiegészítés |
— | kivonás | ||
6 | >> | balról jobbra | jobb váltás |
<< | balra váltani | ||
7 | < | balról jobbra | Kevésbé |
<= | kisebb vagy egyenlő | ||
> | több | ||
>= | nagyobb vagy egyenlő | ||
nyolc | == | balról jobbra | egyenlő |
!= | nem egyenlő | ||
9 | && | balról jobbra | logikus ÉS |
tíz | || | balról jobbra | logikai VAGY |
tizenegy | ?: | jobbról balra | feltételes művelet (hármas művelet) |
12 | = | jobbról balra | feladat |
*= | szorzás hozzárendeléssel | ||
/= | felosztás megbízással | ||
%= | az osztás maradéka megbízással | ||
+= | kiegészítés megbízással | ||
-= | kivonás hozzárendeléssel | ||
13 | , | balról jobbra | vessző |
Kétség esetén zárójelet kell használni. Egyes esetekben az operátor elsőbbségének implicit hatásai lehetnek. Vegyünk egy példát:
int n = 5 ; cout << n += 3 ;Annak ellenére, hogy a kód egy ember számára nyilvánvaló, a fordító hibát generál: a 2. sorban lévő kifejezésben először a bitenkénti eltolási operátor (<<) kerül végrehajtásra. precedenciája 6, és magasabb, mint az összeadás-hozzárendelés operátor precedenciája (+=) 12. Ennek eredményeként az n változó értéke átkerül a cout folyamba, és a += művelet nem lesz teljesített.