Operatorprioritet
Operatorprioritet eller prioriteringsregler för operatorer är ett begrepp inom bland annat matematik och programmering. Operatorprioriteten används för att avgöra i vilken ordning operationer (räknesätt) utförs om man reducerar (beräknar) ett matematiskt uttryck. Behovet kommer från att vissa uttryck, exempelvis 1 + 2 · 3 har olika värden beroende på om man först adderar 1 + 2 (då uttrycket har värdet 9) eller först multiplicerar 2 · 3 (då uttrycket har värdet 7).
Prioriteringsregler i matematik
De prioriteringsregler som används i matematik kan sammanfattas med följande: "Först beräknas parenteser, sedan potenser, därefter utförs multiplikation och division i valfri ordning. Sist utförs addition och subtraktion i valfri ordning. Det kan förekomma flera parenteser inne i varandra; man börjar då inifrån."[1] Detta kan leda till tvetydighet. Därför är ordningen för addition och subtraktion liksom för multiplikation och division att operationerna i allmänhet utförs från vänster till höger, dvs 5-2+3 = (5-2)+3 = 6, och inte 5-(2+3) = 0. [2][3] Negativtecken prioriteras lägre än potenser, vilket exempelvis innebär att −3² har värdet −9.[4] (Se dock under tvetydigheter och avsteg nedan.)
Ibland används hakparenteser istället för vanliga parenteser för att göra det enklare att läsa. Det förekommer att prioriteringsreglerna som anges ovan kompletteras med en vänster-till-höger-princip, så att 1 / 2 · 3 tolkas som (1/2) · 3 och 1 − 2 + 3 tolkas som (1 − 2) + 3. Detta är dock inte en självklar konvention och man kan inte utgå från att den används av alla.
Prioriteringsreglerna är en konvention – det finns vanligtvis inget inneboende i matematiken eller matematiska uttryck som säger att visa operationer bör eller måste behandlas före andra.
Minnesregler
![Bild på prioriteringsdjävulen: ett ansikte som utgörs av parenteser samt symboler för räknesätt.](http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Prioriteringsdj%C3%A4vulen.svg/250px-Prioriteringsdj%C3%A4vulen.svg.png)
En minnesregel för prioriteringsreglerna är akronymen PUMDAS/PEMDAS: parentes, upphöjt/exponenter, multiplikation, division, addition, subtraktion. Dessa minnesregler säger att multiplikation respektive addition har högre prioritet än division respektive subtraktion, vilket inte följer från beskrivningen av prioriteringsregler i Matematiktermer för skolan (ovan).
En annan minnesregel är den så kallade prioriteringsdjävulen (se bild), där parenteser och räknesätt utgör ett ansikte. Prioritering på räknesätt kan läsas uppifrån och ner i bilden.
Tvetydigheter och avsteg
Prioriteringsreglerna som anges ovan räcker inte för att entydigt avgöra hur alla uttryck ska beräknas eller utvärderas. Nedan följer några exempel på tvetydigheter.
- Uttrycket 1 / 2 · 3 kan både ha värdet 1,5 och 1/6, beroende på om det tolkas som (1/2) · 3 eller 1 / (2·3). För att undvika tvetydigheter kan man exempelvis skriva ut parenteser eller använda bråkstreck: respektive . I allmänhet, i stort sett alltid, gäller dock regeln att för lika prioritet så utvärderas uttrycket från vänster till höger, dvs 1 / 2 · 3 = 3/2.
- Uttrycket a/bc kan både tolkas som (a / b) · c och a / (bc), ofta dock som det senare. I vissa fall anses alltså att sådan implicit multiplikation (dvs där multiplikationstecknet inte skrivs ut) har en egen och högre prioritet, tex så är fallet sådant för flera av Casios miniräknare, medan i andra fall så anses implicit multiplikation ha samma prioritet, som tex vad gäller Texas Instruments miniräknare. Generellt finns ingen speciell regel för implicit multiplikation och många programvaror, som tex Wolfram Alpha, följer en strikt ordning där implicit multiplikation har samma prioritet som annan multiplikation och utvärdering sker från vänster till höger vid samma prioritet (ex. tolkar Wolfram Alpha 1/2x = x/2), medan vissa andra programvaror där sådana uttryck tillåts, tex Julia, tolkar 1/2x som 1/(2*x). En orsak till att uttryck som a/bc och 1/2x ofta tolkas som a/(bc) resp 1/(2x) är att de flesta matematiskt skolade hellre skulle ha skrivit ac/b resp x/2 om de hade avsett detta (där i allmänhet alltså operationer vid lika prioritet utvärderas från vänster till höger). Oberoende av vilket så bör dylika tvetydigheter undvikas, och tolkningen baseras alltså ofta mer på vad som uppfattas som rimligt än på regler.
- Uttrycket sin x + 2 kan både tolkas som sin(x) + 2 och sin(x + 2). Parenteser gör att tvetydigheten försvinner.
Det finns också fall där etablerade programvaror bryter mot de gängse prioriteringsreglerna.
- Uttrycket −3² utvärderas enligt gängse prioriteringsregler till −9, men vissa programvaror (så som Microsoft Excel, Google Sheets och LibreOffice Calc) ger istället värdet 9. Detta beror på att dessa programvaror prioriterar unära operatorer (så som negativtecknet) högre än binära operatorer (så som upphöjt till och även subtraktion).[5] Genom att använda parenteser kan skillnaderna undvikas.
- Upprepade upphöjningar till markerat med insättningstecken (^) hanteras på olika sätt av olika programvaror. Wolfram Alpha och Google-sökning hanterar
a^b^c
soma^(b^c)
, i enlighet med hur utvärderas, medan Microsoft Excel och MATLAB hanterar uttrycket som(a^b)^c
.
Explicit prioritering av operatorer
Ur strikt matematisk mening genomförs varje operation alltid en i taget, och den ordning operationerna är tänkta att genomföras kan markeras explicit genom att använda parenteser för varje operator istället för att förlita sig på prioriteringsregler. Ett sådant uttryck kan exempelvis vara ((a · b) · c) · (−d), som säger att a och b ska multipliceras, resultatet sedan multipliceras med c, som sedan ska multipliceras med (−d).
Explicit prioritering av operatorer kan vara användbart vid beräkningar med annat än reella tal där principer som kommutativitet eller associativitet inte gäller: Om A, B och C är reella tal har uttrycket A + B + C samma värde oavsett första två eller sista två termerna adderas först, men detta behöver inte gälla om A, B och C är andra typer av element. Explicit prioritering av operatorer kan också vara användbart när datorer ska utvärdera eller bearbeta uttryck.
Operatorprioritet i programmering
Olika programspråk använder olika regler för operatorprioritet. Tabellen nedan avspeglar prioritet som används i många C-liknande programspråk.
1 | () [] -> . :: | Funktionsanrop, arrayåtkomst, etc. |
2 | ! ~ - + * & sizeof type cast ++ -- | De flesta unära operatorerna, typomvandling, etc. |
3 | * / % MOD | Multiplikation, division och modulo |
4 | + - | Addition och subtraktion |
5 | << >> | Bitvis skiftning höger och vänster |
6 | < <= > >= | Jämförelseoperatorer: större/mindre än |
7 | == != | Jämförelseoperatorer: lika med och inte lika med |
8 | & | Bitvis AND |
9 | ^ | Bitvis XOR |
10 | | | Bitvis OR |
11 | && | Logisk AND |
12 | || | Logisk OR |
13 | ? : | Villkorat uttryck (ternary operation) |
14 | = += -= *= /= %= &= |= ^= <<= >>= | Tilldelningsoperatorer |
15 | , | Komma |
Se även
- Omvänd polsk notation, ett alternativt sätt som inte använder parenteser
- Operator (programmering)
Referenser
- ^ Matematiktermer för skolan (1. uppl). Nationellt centrum för matematikutbildning (NCM), Göteborgs universitet. 2008. ISBN 978-91-85143-12-2. OCLC 489124236. https://www.worldcat.org/oclc/489124236. Läst 21 april 2021
- ^ ”Matteguiden Räkneregler”. Matteguide. http://www.matteguiden.se/rakneregler/. Läst 20 juni 2022.
- ^ ”Matematik för naturvetare”. Institutionen för matematiska vetenskaper, Charlmer. 27 augusti 2010. http://www.math.chalmers.se/Math/Grundutb/GU/MMGN00/S11/IntroNatVetMMGN00_S10.pdf. Läst 20 juni 2022.
- ^ Bronštejn, Ilʹja N. (1985). Taschenbuch der Mathematik [Hauptbd..] (22. Aufl). ISBN 978-3-87144-492-0. OCLC 180385800. https://www.worldcat.org/oclc/180385800. Läst 21 april 2021
- ^ ”Formula Returns Unexpected Positive Value”. Microsoft. 19 april 2015. Arkiverad från originalet den 19 april 2015. https://web.archive.org/web/20150419091629/https://support.microsoft.com/en-gb/kb/kbview/132686. Läst 21 april 2021.