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
?
++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ď: https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i
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.
++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í.
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
.