C: Aký je rozdiel medzi ++i a i++?

Aký je v jazyku C rozdiel medzi použitím ++i a i++ a ktorý z nich by sa mal použiť v inkrementačnom bloku cyklu for?

Riešenie
  • ++i zvýši hodnotu i a potom vráti zvýšenú hodnotu.

       i = 1;
       j = ++i;
       (i je 2, j je 2)
  • i++ zvýši hodnotu i, ale vráti pôvodnú hodnotu, ktorú malo i pred zvýšením.

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

Pre cyklus for funguje obidve možnosti. Zdá sa, že ++i je bežnejší, možno preto, že sa používa v K&R.

V každom prípade sa riaďte pokynom "uprednostnite ++i pred i++" a neurobíte chybu.

Existuje'niekoľko poznámok týkajúcich sa efektívnosti ++i a i++. V každom kompilátore, ktorý nie je študentským projektom, nebude žiadny výkonnostný rozdiel. Môžete si to overiť pohľadom na vygenerovaný kód, ktorý bude identický.

Otázka efektivity je zaujímavá... tu je môj pokus o odpoveď:

Ako poznamenáva On Freund, v prípade objektu C++ je to iné, pretože operátor++() je funkcia a kompilátor nemôže'vedieť optimalizovať vytvorenie dočasného objektu na uchovávanie medziproduktu.

Komentáre (14)

++i zvýši hodnotu a potom ju vráti.

i++ vráti hodnotu a potom ju zvýši.

Je to jemný rozdiel.

Pre cyklus for použite ++i, pretože je to o niečo rýchlejšie. i++ vytvorí extra kópiu, ktorá sa jednoducho vyhodí.

Komentáre (2)

Dôvodom, prečo ++i môže byť o niečo rýchlejšie ako i++, je to, že i++ môže vyžadovať lokálnu kópiu hodnoty i pred jej inkrementáciou, zatiaľ čo ++i nikdy. V niektorých prípadoch to niektoré kompilátory optimalizujú, ak je to možné... ale nie vždy je to možné a nie všetky kompilátory to robia.

Snažím sa príliš nespoliehať na optimalizáciu kompilátorov, takže by som sa riadil'radou Ryana Foxa: keď môžem použiť oboje, použijem ++i.

Komentáre (1)