C: Hva er forskjellen mellom ++i og i++?

I C, hva er forskjellen mellom å bruke ++i og i++, og hvilken skal brukes i inkrementeringsblokken i en for-løkke?

Løsning
  • ++i vil inkrementere verdien av i, og deretter returnere den inkrementerte verdien.

       i = 1;
       j = ++i;
       (i er 2, j er 2)
  • i++ vil inkrementere verdien av i, men returnere den opprinnelige verdien som i hadde før den ble inkrementert.

       i = 1;
       j = i++;
       (i er 2, j er 1)

For en for løkke fungerer begge. ++i virker mer vanlig, kanskje fordi det er det som brukes i K&R.

I alle fall, følg retningslinjen "foretrekker ++i over i++ " og du vil' ikke gå galt.

Det er et par kommentarer angående effektiviteten til ++i og i++. I en hvilken som helst kompilator som ikke er studentprosjekt, vil det ikke være noen ytelsesforskjell. Du kan bekrefte dette ved å se på den genererte koden, som vil være identisk.

Effektivitetsspørsmålet er interessant ... her er mitt forsøk på et svar:

Som On Freund notater, det er annerledes for et C++-objekt, siden operator++() er en funksjon, og kompilatoren kan ikke vite å optimalisere bort opprettelsen av et midlertidig objekt for å holde mellomverdien.

Kommentarer (14)

++i inkrementerer verdien og returnerer den deretter.

i++ returnerer verdien, og inkrementerer den deretter.

Det er en subtil forskjell.

For en for-sløyfe, bruk ++i, da det er litt raskere. i++ vil opprette en ekstra kopi som bare blir kastet bort.

Kommentarer (2)

Grunnen til at ++i kan være litt raskere enn i++ er at i++ kan kreve en lokal kopi av verdien til i før den blir inkrementert, mens ++i aldri gjør det. I noen tilfeller vil noen kompilatorer optimalisere det bort hvis mulig ... men det er ikke alltid mulig, og ikke alle kompilatorer gjør dette.

Jeg prøver å ikke stole for mye på kompilatoroptimaliseringer, så jeg følger Ryan Foxs råd: når jeg kan bruke begge deler, bruker jeg ++i.

Kommentarer (1)