Är ++ inte samma sak som +1 (javascript)

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Feb 2005

Är ++ inte samma sak som +1 (javascript)

Hej!

Som topic lyder.

Alltid trott att variabel ++ är samma sak som variabel +1.

Vad är skillnaden mellan ++ och +1, eller finns det någon?

Gaemer Addicted!

Trädvy Permalänk
Medlem
Registrerad
Apr 2013

++ är samma som +=1.

Still play with birds like I hang with mother goose.

Trädvy Permalänk
Medlem
Registrerad
Feb 2015

Om det funkar likadant som i C (vilket jag tror det gör) så innebär x++ att utrycket returnerar värdet av x och därefter ökar x med 1.
++x däremot ökar först x med 1, och returnerar det nya värdet.


x=4;
y=x++;

Skulle ge y=4 och x=5 medan
x=4;
y=++x;
skulle ge x=y=5;

x=4;
y=x+1;
skulle däremot ge
x=4 och y=5, dvs x ändras inte vilket det gör när du använder ++ operatorn.

Trädvy Permalänk
Medlem
Plats
Linköping
Registrerad
Jun 2007

variabel++ ökar värdet på variabeln med 1, medan variabel+1 adderar variabel och 1 utan att ändra värdet på variabel. Se t.ex. denna referens.

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011

De är inte ekvivalenta. Så här fungerar det:

foo++;

brukar man använda som en shorthand för

foo = foo + 1;

Men värdet av foo++ är inte detsamma som värdet av foo = foo + 1:

> let foo = 5; undefined > foo++ 5 > foo 6

Notera skillnaden:

> let foo = 5; undefined > foo = foo + 1 6 > foo 6

  • Värdet av foo++ är "det värde foo hade innan inkrementeringen".

  • Värdet av ++foo är "det värde foo har efter inkrementeringen".

  • Värdet av foo = foo + 1 är "det värde foo har efter inkrementeringen".

Alla tre uttryck har sidoeffekten att foo inkrementeras.

(Sedan har du förstås också värdet av foo + 1, vilket bara är "1 större än foo", precis som det låter.)

Exempel

Det kan bli väldigt fel om man inte är uppmärksam.

let foo = 0; let acc = 0; while (foo++ < 10) { acc += foo; } console.log(acc);

Resultat:

55

Notera skillnaden:

let foo = 0; let acc = 0; while (++foo < 10) { acc += foo; } console.log(acc);

Resultat:

45

5930K • Corsair DP 32 GiB • EVGA GTX 980 • 2x Swift PG278Q
Better SweClockersDisplayPort över USB-C

Köp processor för framtiden™, men inte grafikkort.

Trädvy Permalänk
Datavetare
Plats
Stockholm
Registrerad
Jun 2011

@Alling: exakt.

Värt att nämna är att både foo++ och ++foo båda är exempel på satser då de faktiskt utför en sidoeffekt, i detta fall ökar värde på foo med ett.

Däremot är foo + 1 ett uttryck då de endast beräknar ett värde men inget tillstånd förändras.

Alltid bra att hålla isär dessa två begrepp när man resonerar kring kod, lite kursmateria som bl.a. tar upp satser och uttryck.

Edit: tog bort referensen till KTH. Fick en google-träff på en KTH sidan, men själva dokumentet kommer ju från Linköpings universitet. Nog för att jag är gammal KTH-student, men rätt ska vara rätt

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Trädvy Permalänk
Entusiast
Testpilot
Plats
Chalmers
Registrerad
Aug 2011
Skrivet av Yoshman:

@Alling: exakt.

Värt att nämna är att både foo++ och ++foo båda är exempel på satser då de faktiskt utför en sidoeffekt, i detta fall ökar värde på foo med ett.

Däremot är foo + 1 ett uttryck då de endast beräknar ett värde men inget tillstånd förändras.

Alltid bra att hålla isär dessa två begrepp när man resonerar kring kod, lite kursmateria från KTH som bl.a. tar upp satser och uttryck.

Jättebra poäng! Tyvärr, kanske man ska säga, används ju ofta satser (med sidoeffekter) medvetet som uttryck i JavaScript, till exempel i konstruktioner som while (i-- > 0) { ... }.

I många fall är deklarativ kod med hög referentiell transparens att sträva efter. Tyvärr läggs det i mina ögon för lite vikt på det inom relevanta utbildningar.

5930K • Corsair DP 32 GiB • EVGA GTX 980 • 2x Swift PG278Q
Better SweClockersDisplayPort över USB-C

Köp processor för framtiden™, men inte grafikkort.