Prioritet och associativitet hos operatorerna i C

De viktigaste operatorerna:

Prioritet Kategori Operator Associativitet
Högsta Unära postfixoperatorer (), [], ->, ., ++, -- vänster
  Unära prefixoperatorer !, ++, +, -, *, &, sizeof, (typ) höger
  Multiplikation mm *, /, % vänster
  Addition mm +, - vänster
  Jämförelser <, <=, >=, > vänster
  Likhetsjämförelser ==, != vänster
  Logiskt OCH && vänster
  Logiskt ELLER || vänster
Lägsta Tilldelning =, +=, -=, *=, /=, %= höger

Några kommentarer:

Prioritet och associativitet används för att bestämma hur ett uttryck ska beräknas. Ska till exempel
1 - 2 - 3 * 4
beräknas som
1 - (2 - (3 * 4))
vilket blir 11, eller kanske som
((1 - 2) - 3) * 4
vilket blir -16, eller på något annat sätt?

Om ett uttryck innehåller operatorer med olika prioritet, grupperas uttrycket efter prioritetsordningen hos operatorerna. Exempel:
2 * 3 + 4 * 5
tolkas som
(2 * 3) + (4 * 5)
och inte till exempel som
2 * (3 + 4) * 5
eftersom operatorn * (multiplikation) har högre prioritet än operatorn + (addition).

Om ett uttryck innehåller flera operatorer med samma prioritet, grupperas uttrycket efter associativiteten hos operatorerna. Exempel:
2 - 3 - 4
tolkas som
(2 - 3) - 4
och inte som
2 - (3 - 4)
eftersom operatorn - (subtraktion) är vänsterassociativ.

Parenteser kan alltid användas för att gruppera uttrycket annorlunda, till exempel som
2 * (3 - (4 - 5))

Den fullständiga tabellen, med alla operatorer som finns i C:

Prioritet Kategori Operator Associativitet
Högsta Unära postfixoperatorer (), [], ->, ., ++, -- vänster
  Unära prefixoperatorer !, ~, ++, +, -, *, &, sizeof, (typ) höger
  Multiplikation mm *, /, % vänster
  Addition mm +, - vänster
  Bitvis skift <<, >> vänster
  Jämförelser <, <=, >=, > vänster
  Likhetsjämförelser ==, != vänster
  Bitvis OCH & vänster
  Bitvis XOR ^ vänster
  Bitvis ELLER | vänster
  Logiskt OCH && vänster
  Logiskt ELLER || vänster
  Villkorsoperatorn ?: höger
  Tilldelning =, +=, -=, *=, /=, %=, >>=, <<=, &=, ^=, |= höger
Lägsta Komma-operatorn , vänster


Thomas Padron-McCarthy (thomas.padron-mccarthy@tech.oru.se), 10 januari 2006