C: Wat is het verschil tussen ++i en i++?

Wat is in C het verschil tussen het gebruik van ++i en i++, en welke moet worden gebruikt in het incrementatieblok van een for-lus?

Oplossing
  • ++i zal de waarde van i verhogen, en dan de verhoogde waarde teruggeven.

       i = 1;
       j = ++i;
       (i is 2, j is 2)
  • i++ verhoogt de waarde van i, maar geeft de oorspronkelijke waarde terug die i had voordat i werd verhoogd.

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

Voor een for loop, werkt beide. ++i lijkt gebruikelijker, misschien omdat dat is wat in K&R wordt gebruikt.

In ieder geval, volg de richtlijn "verkies ++i boven i++" en je zult't niet fout gaan.

Er's een paar opmerkingen over de efficiëntie van ++i en i++. In elke niet-studenten project compiler, zal er geen verschil in prestatie zijn. Je kunt dit verifiëren door naar de gegenereerde code te kijken, die identiek zal zijn.

De vraag over de efficiëntie is interessant... hier's mijn poging tot een antwoord:

Zoals On Freund opmerkt, is het'anders voor een C++ object, omdat operator++() een functie is en de compiler kan'niet weten om het maken van een tijdelijk object om de tussenliggende waarde te bewaren weg te optimaliseren.

Commentaren (14)

++i verhoogt de waarde, en geeft het dan terug.

i++ geeft de waarde terug, en verhoogt deze dan.

Het is een subtiel verschil.

Voor een for-lus, gebruik ++i, omdat het iets sneller is. i++ zal een extra kopie maken die gewoon weggegooid wordt.

Commentaren (2)

De reden dat ++i kan iets sneller zijn dan i++ is dat i++ een lokale kopie van de waarde van i kan vereisen voordat het wordt verhoogd, terwijl ++i dat nooit doet. In sommige gevallen zullen sommige compilers dit weg optimaliseren indien mogelijk... maar dat is niet altijd mogelijk, en niet alle compilers doen dit.

Ik probeer niet te veel te vertrouwen op compilers optimalisaties, dus ik'zou Ryan Fox's advies volgen: wanneer ik beide kan gebruiken, gebruik ik ++i.

Commentaren (1)