Operatory inkrementacji i dekrementacji prefiksu: ++ i --

Składnia

++ unary-expression
-- unary-expression

Uwagi

Operator inkrementacji prefiksu (++) dodaje jeden do operandu. Ta wartość przyrostowa jest wynikiem wyrażenia. Operand musi być wartością l nie typu const. Wynik jest wartością l tego samego typu co operand.

Operator dekrementacji prefiksu (--) jest analogiczny do operatora inkrementacji prefiksu, z tą różnicą, że operand jest dekrementowany przez jeden, a wynikiem jest ta wartość dekrementowana.

Program Visual Studio 2017 w wersji 15.3 lub nowszej (dostępny w /std:c++17 trybie i nowszych): operand operatora przyrostowego lub dekrementacji może nie być typu bool.

Zarówno prefiks, jak i operatory przyrostka i dekrementacji wpływają na ich operandy. Kluczową różnicą między nimi jest kolejność, w której następuje przyrost lub dekrementacja w ocenie wyrażenia. (Aby uzyskać więcej informacji, zobacz Operatory przyrostka przyrostkowego i dekrementacji). W formularzu prefiksu następuje przyrost lub dekrementacja przed zastosowaniem wartości w ocenie wyrażenia, więc wartość wyrażenia różni się od wartości operandu. W formularzu postfiksu następuje przyrost lub dekrementacja po użyciu wartości w ocenie wyrażenia, więc wartość wyrażenia jest taka sama jak wartość operandu. Na przykład następujący program drukuje ciąg "++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 typu całkowitego lub zmiennoprzecinkowego jest zwiększany lub dekrementowany przez wartość całkowitą 1. Typ wyniku jest taki sam jak typ operandu. Operand typu wskaźnika jest zwiększany lub dekrementowany przez rozmiar obiektu, który adresuje. Wskaźnik przyrostowy wskazuje następny obiekt; wskaźnik dekrementowany wskazuje poprzedni obiekt.

Ze względu na to, że operatory przyrostowe i dekrementacyjne mają skutki uboczne, użycie wyrażeń z operatorami przyrostowymi lub dekrementacji w makrze preprocesora może mieć niepożądane wyniki. Rozważ taki przykład:

// 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 rozszerza się na:

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

Jeśli i wartość jest większa lub równa j lub mniejsza niż j 1, zostanie dwukrotnie zwiększana.

Uwaga

Funkcje wbudowane języka C++ są preferowane w wielu przypadkach, ponieważ eliminują skutki uboczne, takie jak opisane tutaj, i umożliwiają językowi wykonywanie bardziej kompletnego sprawdzania typów.

Zobacz też

Wyrażenia z operatorami jednoargumentowymi
Wbudowane operatory, pierwszeństwo i kojarzenie języka C++
Operatory prefiksów inkrementacji i dekrementacji