====== Inkrementace, dekrementace ====== Inkrementace ''++'' a dekrementace ''- -'' jsou operátory, které zvětší, resp. sníží hodnotu proměnné o hodnotu 1. Velmi se používají například v cyklech ''for''. Můžeme je nahradit standardním operátorem přiřazení. Příkaz ''x++;'' je ekvivalentní příkazu ''x = x + 1;''. ===== Příklad ===== int cislo = 41; cislo++; printf("%d\n", cislo); cislo--; printf("%d\n", cislo); Výstupem tohoto kódu bude: 42 41 ===== Prefixová a postfixová syntaxe ===== Oba tyto operátory se dají použít jak v **prefixové formě**: ''++n;'', tak i v **postfixové formě**: ''n++''. Rozdíl těchto dvou syntaxí je okamžik, kdy dojde k přičtění/odečtění jedničky. **Prefixová syntaxe** změní hodnotu referované proměnné před vyhodnocením výrazu. **Postfixová syntaxe** změní hodnotu referované proměnné po vyhodnocení výrazu. ==== Příklad prefix vs postfix ==== int x = 41; printf("%d\n", ++x); if (x-- == 42) puts("Foo"); Výstupem tohoto kódu bude: 42 Foo Protože hodnota 41 je inkrementována předtím, než je vypsána. A v příkazu ''if'' je její hodnota zmenšena až po vyhodnocení podmínky. ===== Limitace použití těchto operátorů ===== Funkce těchto operátorů je v C/C++ značně omezená a snadno můžeme dosáhnout nedefinovaného chování, které někdy nebude kompilátorem vyhodnoceno jako chybné, ale výsledek se může na jiném systému značně lišit. Proto dbáme na to, ať **používáme jen jeden operátor inkrementace/dekrementace v rámci jednoho výrazu** Několik příkladů nesprávného použití * ''++a++;'' * ''++(++i);'' * ''a+++++b;'' ===== Odkazy ===== * [[https://en.cppreference.com/w/cpp/language/operator_incdec]] * [[https://stackoverflow.com/questions/45786179/why-cant-you-increment-decrement-a-variable-twice-in-the-same-expression|Why can't you increment/decrement a variable twice in the same expression?]] * [[https://stackoverflow.com/questions/5341202/why-doesnt-ab-work|Why doesn't a+++++b work?]] * [[https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points|Undefined behavior and sequence points]]