Műveleti prioritás

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2017. március 21-én felülvizsgált verziótól ; az ellenőrzések 3 szerkesztést igényelnek .

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 rangsorolási műveletek gyakorlata

C++ nyelven

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.