Prioritet , rang eller tjänstgöringstid för en verksamhet eller operatör är en formell egenskap hos en operatör/verksamhet som påverkar ordningen för dess utförande i ett uttryck med flera olika operatörer i avsaknad av en explicit (med parentes) angivelse av i vilken ordning de utvärderas. Till exempel ges multiplikationsoperationen vanligtvis högre prioritet än additionsoperationen, så uttrycket får först produkten och , och sedan summan.
Operationer kan ha samma företräde, i vilket fall de utvärderas enligt den associativitetsregel som fastställts för dessa operationer.
I formella system finns det två sätt att sätta företräde för en operatör. Den första är fördelningen av alla operatörer enligt prioriteringshierarkin. Denna metod används alltid för att sätta standardprioriteringar och är fixerad i språkbeskrivningen i form av en överenskommelse om att sådana och sådana operatörer tilldelas sådana och sådana prioriteringar. Det tar inte emot någon reflektion i språkets syntax, det vill säga att det inte använder några explicita medel (= dessa / andra symboler) för att indikera prioritet för operationen.
Den andra metoden gör det möjligt att ändra standardprioriteterna genom att explicit specificera dem med hjälp av parade parenteser. Samtidigt är kapsdjupet direkt proportionellt mot prioritetsvärdet, det vill säga fler inre parenteser indikerar en högre prioritet än de yttre som ramar in dem. I föregående exempel med summan och produkten kan beräkningsordningen ändras med hjälp av parenteser, genom att skriva hela uttrycket så här: eller så här: .
Företrädet för operationer är den ordning i vilken operationer utförs i uttrycket, förutsatt att det inte finns någon explicit indikation på i vilken ordning operationer utförs i uttrycket (med parentes).
Om operationer har samma prioritet, bestäms ordningen för utförande av sådana operationer enligt associativitetsegenskapen.
Associativitet är riktningen för utförandet av operationer om operationerna har samma prioritet:
En prioritet | Drift | Associativitet | Beskrivning |
---|---|---|---|
ett | :: | från vänster till höger | unär scope resolution operation |
[ ] | indexeringsoperation | ||
() | runda fästen | ||
. | åtkomst till en medlem av en struktur eller klass | ||
-> | åtkomst till en medlem av en struktur eller klass genom en pekare | ||
2 | ++ | från vänster till höger | postfix-ökning |
— | postfix dekrement | ||
3 | ++ | från höger till vänster | prefixökning |
— | prefix dekrement | ||
fyra | * | från vänster till höger | multiplikation |
/ | division | ||
% | resten av divisionen | ||
5 | + | från vänster till höger | tillägg |
— | subtraktion | ||
6 | >> | från vänster till höger | höger skift |
<< | skift vänster | ||
7 | < | från vänster till höger | mindre |
<= | mindre än eller lika | ||
> | Mer | ||
>= | större än eller lika med | ||
åtta | == | från vänster till höger | lika |
!= | inte lika med | ||
9 | && | från vänster till höger | logiskt OCH |
tio | || | från vänster till höger | logiskt ELLER |
elva | ?: | från höger till vänster | villkorlig drift (ternär drift) |
12 | = | från höger till vänster | uppdrag |
*= | multiplikation med uppgift | ||
/= | division med uppdrag | ||
%= | återstoden av divisionen med uppdrag | ||
+= | tillägg med uppdrag | ||
-= | subtraktion med tilldelning | ||
13 | , | från vänster till höger | kommatecken |
Vid tveksamhet bör parentes användas. I vissa fall kan operatörsföreträde ha implicita effekter. Tänk på ett exempel:
int n = 5 ; cout << n += 3 ;Trots uppenbarheten av koden för en människa kommer kompilatorn att generera ett fel: i uttrycket på rad 2 kommer den bitvisa skiftoperatorn (<<) att exekveras först. dess prioritet är 6, och det är högre än prioritet för additionstilldelningsoperatorn (+=) 12. Som ett resultat kommer värdet av variabeln n att skickas till cout-strömmen, och +=-operationen kommer inte att vara genomförde.