x++, ++x, x+=1 eller x=x+1?

x++, ++x, x+=1 och x=x+1, alla är de olika sätt att öka värdet på variabeln x med ett. Det kan verka märkligt att det finns så många sätt att öka en variabels värde. Behövs verkligen alla och är det egentligen någon skillnad på dem?

Svaret är helt klart ja. Det finns en tydlig skillnad mellan operatorerna och dess tänkta användningsområden och det finns en motivering till att de alla behövs. För att hitta denna motivering tittar vi på operatorernas historia. Från början fanns nämligen bara den vanliga plus-operatorn. En normal addition har formen a+b, där a och b kan vara godtyckliga uttryck. Uttrycken a och b beräknas innan själva additionen. Det innebär att i additionen 5+(3*7) kommer 3*7 att beräknas först, och därefter beräknas 5+21.

När man beräknar ett uttryck vill man normalt använda resultatet på något sätt också. Till exempel så sparar man det i en variabel: x=a+5. Denna sats kommer först att hämta värdet ur a, till detta adderas 5 och sedan sparas resultatet i x. I imperativa programmeringsspråk kan man även spara resultatet i variabler som ingår i beräkningen. x=x+1 är alltså bara ett specialfall av den klassiska additionen.

Det där med att ändra på en variabels värde är något man gör väldigt ofta när man programmerar. Det ligger i de imperativa programmeringsspråkens natur att göra sådant. Detta har gjort att man lagt till en operator, +=, för att underlätta just sådan kod. Istället för att skriva x=x+a kan man skriva x+=a. När man vet vad det betyder så blir koden mer överskådlig om man använder += istället för att skriva det längre alternativet. Det är fritt att välja mellan x+=a och x=x+a då de är identiska i alla avseenden. Utöver += finns även övriga räknesätt representerade med: -=, *=, /=, &= och |=.

Inte nog med att det är mycket vanligt att man beräknar ett nytt värde på en redan existerande variabel, det nya värdet är nästan alltid exakt ett större eller ett mindre än det gamla värdet. Det vill säga, den vanligaste beräkningen är x=x+1. Så är det eftersom denna beräkning förekommer i många loopar och på andra ställen där man stegar igenom något data ett steg i taget. Eftersom detta är en såpass vanlig beräkning vill man göra koden lite tydligare och skilja mellan den vanliga additionen med ett och det faktum att man ökar ett index ett steg. Detta gör man genom att använda ++.

++ skrivs antingen före eller efter den variabel man vill öka värdet på. Valet om det ska stå före eller efter är inte alltid uppenbart. Om satsen x++ står för sig självt har det ingen betydelse om ++ står före eller efter x. Däremot om satsen är en del av något större uttryck är det viktigt att tänka på i vilken ordning man vill att saker ska ske. Skriver man ++ före x så kommer värdet på x att ökas innan x används i det kringliggande uttrycket, om ++ ligger efter sker uppräkningen efter.

x = 5;
y = x++;

y tilldelas värdet 5, x ökas sedan till 6.
x = 5;
y = ++x;

x ökas till 6, y tilldelas därefter värdet 6.
x = 5;
y = ++x--;

x ökas till 6, y tilldelas värdet 6 och x minskas sedan till 5 igen.
x = 5;
y = (x + 1)++;

Fel!

Som vi ser i exemplet ovan så finns även operationen -- som minskar värdet med ett. Den används på samma sätt som ++. Det sista exemplet blir fel eftersom man endast kan använda ++ på variabler. x+1 är ett uttryck och evaluerar i exemplet till 6 och det går inte att öka värdet på siffran 6. Det skulle vara samma sak som att skriva 6=6+1 vilket inte är tillåtet i de flesta programmeringsspråk.

Sammanfatningsvis kan man väl säga (notera att detta är min högst personliga åsikt) att den normala additionen behövs eftersom man vill kunna skriva saker som x=a+b, += behövs eftsersom x+=35 är ett tydligare sätt att skriva x=x+35 och ++ behövs för att särskilja addition med ett från uppräkningen av ett index. För kodexempel som visar de olika sätten att addera rekomenderar jag en titt på källkodssidan. Beräkningar och uppräkningar av index förekommer i de flesta programmen där.