Namespaces
Variants

Increment/decrement operators

From cppreference.net

Les opérateurs d'incrémentation/décrémentation sont des opérateurs unaires qui incrémentent/décrémentent la valeur d'une variable de 1.

Ils peuvent avoir une forme postfixe :

expr ++
expr --

Ainsi que la forme préfixe :

++ expr
-- expr

L'opérande expr des opérateurs d'incrémentation et de décrémentation préfixés et postfixés doit être un lvalue modifiable de type entier (incluant _Bool et les énumérations), de type flottant réel, ou de type pointeur. Il peut être qualifié cvr, non qualifié, ou atomique .

Le résultat des opérateurs d'incrémentation et de décrémentation postfixés est la valeur de expr .

Le résultat de l'opérateur de pré-incrémentation est le résultat de l'ajout de la valeur 1 à la valeur de expr : l'expression ++ e est équivalente à e + = 1 . Le résultat de l'opérateur de pré-décrémentation est le résultat de la soustraction de la valeur 1 de la valeur de expr : l'expression -- e est équivalente à e - = 1 .

Les opérateurs d'incrémentation initient l'effet secondaire d'ajouter la valeur 1 du type approprié à l'opérande. Les opérateurs de décrémentation initient l'effet secondaire de soustraire la valeur 1 du type approprié de l'opérande. Comme pour tout autre effet secondaire, ces opérations se terminent au plus tard au prochain point de séquence .

int a = 1;
int b = a++; // stocke 1+a (qui vaut 2) dans a
             // retourne l'ancienne valeur de a (qui vaut 1)
             // Après cette ligne, b == 1 et a == 2
a = 1;
int c = ++a; // stocke 1+a (qui vaut 2) dans a
             // retourne 1+a (qui vaut 2)
             // après cette ligne, c == 2 et a == 2

Le post-incrément ou le post-décrément sur toute variable atomique est une opération atomique de lecture-modification-écriture avec l'ordre mémoire memory_order_seq_cst .

(depuis C11)

Voir les opérateurs arithmétiques pour les limitations de l'arithmétique des pointeurs, ainsi que pour les conversions implicites appliquées aux opérandes.

Table des matières

Notes

En raison des effets secondaires impliqués, les opérateurs d'incrément et de décrément doivent être utilisés avec précaution pour éviter un comportement indéfini dû à des violations des règles de séquencement .

Les opérateurs d'incrémentation/décrémentation ne sont pas définis pour les types complexes ou imaginaires : la définition habituelle d'ajouter/soustraire le nombre réel 1 n'aurait aucun effet sur les types imaginaires, et le fait de les faire ajouter/soustraire i pour les imaginaires mais 1 pour les nombres complexes aurait fait qu'ils traiteraient 0+yi différemment de yi .

Contrairement au C++ (et certaines implémentations du C), les expressions d'incrémentation/décrémentation ne sont jamais elles-mêmes des lvalues : & ++ a est invalide.

Exemple

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int a = 1;
    int b = 1;
    printf("original values: a == %d, b == %d\n", a, b);
    printf("result of postfix operators: a++ == %d, b-- == %d\n", a++, b--);
    printf("after postfix operators applied: a == %d, b == %d\n", a, b);
    printf("\n");
    // Reset a and b.
    a = 1;
    b = 1;
    printf("original values: a == %d, b == %d\n", a, b);
    printf("result of prefix operators: ++a == %d, --b == %d\n", ++a, --b);
    printf("after prefix operators applied: a == %d, b == %d\n", a, b);
}

Sortie :

original values: a == 1, b == 1
result of postfix operators: a++ == 1, b-- == 1
after postfix operators applied: a == 2, b == 0
original values: a == 1, b == 1
result of prefix operators: ++a == 2, --b == 0
after prefix operators applied: a == 2, b == 0

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 6.5.2.4 Opérateurs de post-incrémentation et post-décrémentation (p: TBD)
  • 6.5.3.1 Opérateurs de pré-incrémentation et pré-décrémentation (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.5.2.4 Opérateurs de post-incrémentation et post-décrémentation (p: TBD)
  • 6.5.3.1 Opérateurs de pré-incrémentation et pré-décrémentation (p: TBD)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.5.2.4 Opérateurs postfixés d'incrémentation et de décrémentation (p: 85)
  • 6.5.3.1 Opérateurs préfixés d'incrémentation et de décrémentation (p: 88)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 6.5.2.4 Opérateurs postfixés d'incrémentation et de décrémentation (p: 75)
  • 6.5.3.1 Opérateurs préfixés d'incrémentation et de décrémentation (p: 78)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 3.3.2.4 Opérateurs de post-incrémentation et post-décrémentation
  • 3.3.3.1 Opérateurs de pré-incrémentation et pré-décrémentation

Voir aussi

Priorité des opérateurs

Opérateurs courants
assignation incrémentation
décrémentation
arithmétique logique comparaison accès aux
membres
autres

a = b
a + = b
a - = b
a * = b
a / = b
a % = b
a & = b
a | = b
a ^ = b
a <<= b
a >>= b

++ a
-- a
a ++
a --

+ a
- a
a + b
a - b
a * b
a / b
a % b
~a
a & b
a | b
a ^ b
a << b
a >> b

! a
a && b
a || b

a == b
a ! = b
a < b
a > b
a <= b
a >= b

a [ b ]
* a
& a
a - > b
a. b

a ( ... )
a, b
( type ) a
a ? b : c
sizeof


_Alignof
(depuis C11)
(jusqu'à C23)

alignof
(depuis C23)

Documentation C++ pour Opérateurs d'incrémentation/décrémentation