Sdílet prostřednictvím


Operátory inkrementace a dekrementace předpon: ++ a --

Syntaxe

++ unary-expression
-- unary-expression

Poznámky

Operátor inkrementace předpony (++) přidá jeden do svého operandu; tato přírůstková hodnota je výsledkem výrazu. Operand musí být l-hodnota ne typu const. Výsledkem je l-hodnota stejného typu jako operand.

Operátor dekrementace předpony (--) je podobný operátoru přírůstku předpony s tím rozdílem, že operand je dekrementován o jeden a výsledek je tato dekrementovaná hodnota.

Visual Studio 2017 verze 15.3 a novější (dostupné v /std:c++17 režimu a novější): Operand operátoru přírůstku nebo dekrementace nemusí být typu bool.

Operátory předpony i přípony inkrementace a dekrementace ovlivňují jejich operandy. Klíčovým rozdílem mezi nimi je pořadí, ve kterém se při vyhodnocování výrazu provádí přírůstek nebo dekrementace. (Další informace najdete v tématu Příponové operátory inkrementace a dekrementace.) Ve formuláři předpony se inkrementace nebo dekrementace provádí před tím, než se hodnota použije ve vyhodnocení výrazu, takže hodnota výrazu se liší od hodnoty operandu. Ve formátu přípony se po použití hodnoty ve vyhodnocení výrazu provede přírůstek nebo dekrementace, takže hodnota výrazu je stejná jako hodnota operandu. Například následující program vytiskne "++i = 6":

// expre_Increment_and_Decrement_Operators.cpp
// compile with: /EHsc
#include <iostream>

using namespace std;

int main() {
   int i = 5;
   cout << "++i = " << ++i << endl;
}

Operand celočíselného nebo plovoucího typu je inkrementován nebo dekrementován celočíselnou hodnotou 1. Typ výsledku je stejný jako typ operandu. Operand typu ukazatele se zvýší nebo sníží o velikost objektu, který adresuje. Inkrementovaný ukazatel odkazuje na další objekt; Dekrementovaný ukazatel odkazuje na předchozí objekt.

Vzhledem k tomu, že operátory inkrementace a dekrementace mají vedlejší účinky, může použití výrazů s operátory inkrementace nebo dekrementace v makru preprocesoru mít nežádoucí výsledky. Podívejte se na tento příklad:

// expre_Increment_and_Decrement_Operators2.cpp
#define max(a,b) ((a)<(b))?(b):(a)

int main()
{
   int i = 0, j = 0, k;
   k = max( ++i, j );
}

Makro se rozbalí na:

k = ((++i)<(j))?(j):(++i);

Pokud i je větší nebo rovno j nebo menší než j 1, zvýší se dvakrát.

Poznámka:

Vložené funkce jazyka C++ jsou vhodnější než makra v mnoha případech, protože eliminují vedlejší účinky, jako jsou ty, které jsou zde popsány, a umožňují jazyku provádět přesnější kontrolu typů.

Viz také

Výrazy s unárními operátory
Integrované operátory C++, jejich priorita a asociativita
Operátory inkrementace a dekrementace předpony