Namespaces
Variants

Assignment operators

From cppreference.net

Les opérateurs d'assignation et d'assignation composée sont des opérateurs binaires qui modifient la variable à leur gauche en utilisant la valeur à leur droite.

Opérateur Nom de l'opérateur Exemple Description Équivalent à
= affectation basique a = b a devient égal à b N/A
+ = affectation d'addition a + = b a devient égal à l'addition de a et b a = a + b
- = affectation de soustraction a - = b a devient égal à la soustraction de b de a a = a - b
* = affectation de multiplication a * = b a devient égal au produit de a et b a = a * b
/ = affectation de division a / = b a devient égal à la division de a par b a = a / b
% = affectation de modulo a % = b a devient égal au reste de a divisé par b a = a % b
& = affectation ET bit à bit a & = b a devient égal au ET bit à bit de a et b a = a & b
| = affectation OU bit à bit a | = b a devient égal au OU bit à bit de a et b a = a | b
^ = affectation XOR bit à bit a ^ = b a devient égal au XOR bit à bit de a et b a = a ^ b
<<= affectation de décalage à gauche bit à bit a <<= b a devient égal à a décalé à gauche de b a = a << b
>>= affectation de décalage à droite bit à bit a >>= b a devient égal à a décalé à droite de b a = a >> b

Table des matières

Affectation simple

Les expressions d'opérateur d'assignation simple ont la forme

lhs = rhs

lhs - modifiable lvalue expression de tout type d'objet complet
rhs - expression de tout type implicitement convertible en lhs ou compatible avec lhs

L'assignation effectue une conversion implicite de la valeur de rhs vers le type de lhs puis remplace la valeur dans l'objet désigné par lhs par la valeur convertie de rhs .

L'assignation retourne également la même valeur que celle stockée dans lhs (de sorte que des expressions telles que a = b = c sont possibles). La catégorie de valeur de l'opérateur d'assignation est non-lvalue (de sorte que des expressions telles que ( a = b ) = c sont invalides).

rhs et lhs doivent satisfaire l'une des conditions suivantes :

  • lhs a le type (éventuellement qualifié ou atomique (depuis C11) ) _Bool et rhs est un pointeur ou une valeur de type nullptr_t (depuis C23)
(depuis C99)
(depuis C23)

Notes

Si rhs et lhs se chevauchent en mémoire (par exemple, ils sont membres de la même union), le comportement est indéfini sauf si le chevauchement est exact et que les types sont compatibles .

Bien que les tableaux ne soient pas assignables, un tableau encapsulé dans une structure est assignable à un autre objet du même type de structure (ou d'un type compatible).

L'effet secondaire de la mise à jour de lhs est séquencé après les calculs de valeur, mais pas les effets secondaires de lhs et rhs eux-mêmes, et les évaluations des opérandes sont, comme d'habitude, non séquencées les unes par rapport aux autres (ainsi les expressions telles que i = ++ i ; sont indéfinies)

L'assignation supprime la plage et la précision supplémentaires des expressions à virgule flottante (voir FLT_EVAL_METHOD ).

En C++, les opérateurs d'assignation sont des expressions lvalue, ce qui n'est pas le cas en C.

#include <stdio.h>
int main(void)
{
    // entiers
    int i = 1, j = 2, k = 3; // initialisation, pas assignation
    i = j = k;   // les valeurs de i et j sont maintenant 3
//  (i = j) = k; // Erreur : lvalue requis
    printf("%d %d %d\n", i, j, k);
    // pointeurs
    const char c = 'A'; // initialisation; pas assignation
    const char *p = &c;  // initialisation; pas assignation
    const char **cpp = &p; // initialisation; pas assignation
//  cpp = &p;   // Erreur : char** n'est pas convertible en const char**
    *cpp = &c;  // OK, char* est convertible en const char*
    printf("%c \n", **cpp);
    cpp = 0;    // OK, la constante de pointeur nul est convertible en tout pointeur
    // tableaux
    int arr1[2] = {1,2}, arr2[2] = {3, 4};
//  arr1 = arr2; // Erreur : impossible d'assigner à un tableau
    printf("arr1[0]=%d arr1[1]=%d arr2[0]=%d arr2[1]=%d\n",
            arr1[0],   arr1[1],   arr2[0],   arr2[1]);
    struct { int arr[2]; } sam1 = { {5, 6} }, sam2 = { {7, 8} };
    sam1 = sam2; // OK : peut assigner des tableaux encapsulés dans des structures
    printf("%d %d \n", sam1.arr[0], sam1.arr[1]);
}

Sortie :

3 3 3
A
arr1[0]=1 arr1[1]=2 arr2[0]=3 arr2[1]=4
7 8

Affectation composée

Les expressions d'opérateur d'affectation composée ont la forme

lhs op rhs
**Note:** Le texte à traduire dans ce fragment HTML est uniquement constitué des termes C++ `lhs`, `op` et `rhs`. Conformément aux instructions : - Ces termes spécifiques au C++ ne doivent pas être traduits - Toutes les balises et attributs HTML sont conservés intacts - La mise en forme originale est préservée Par conséquent, aucune modification n'a été apportée au contenu.

op - l'un des * = , / = % = , + = - = , <<= , >>= , & = , ^ = , | =
lhs , rhs - expressions avec des types arithmétiques (où lhs peut être qualifié ou atomique), sauf lorsque op est + = ou - = , qui acceptent également des types pointeur avec les mêmes restrictions que + et -

L'expression lhs @= rhs est exactement la même que lhs = lhs @ ( rhs ) , sauf que lhs n'est évalué qu'une seule fois.

Si lhs a un type atomic , l'opération se comporte comme une unique opération atomique de lecture-modification-écriture avec l'ordre mémoire memory_order_seq_cst .

Pour les types atomiques entiers, l'assignation composée @ = est équivalente à :

T1* addr = &lhs;
T2 val = rhs;
T1 old = *addr;
T1 new;
do { new = old @ val } while (!atomic_compare_exchange_strong(addr, &old, new);
(depuis C11)
#include <stdio.h>
int main(void)
{
    int x = 10; 
    int hundred = 100; 
    int ten = 10; 
    int fifty = 50; 
    printf("%d %d %d %d\n", x, hundred, ten, fifty);
    hundred *= x; 
    ten     /= x; 
    fifty   %= x; 
    printf("%d %d %d %d\n", x, hundred, ten, fifty);
    return 0;
}

Sortie :

10 100 10 50
10 1000 1 0

Références

  • Norme C17 (ISO/CEI 9899:2018) :
  • 6.5.16 Opérateurs d'affectation (p: 72-73)
  • Norme C11 (ISO/CEI 9899:2011) :
  • 6.5.16 Opérateurs d'affectation (p: 101-104)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 6.5.16 Opérateurs d'affectation (p: 91-93)
  • Norme C89/C90 (ISO/IEC 9899:1990) :
  • 3.3.16 Opérateurs d'affectation

Voir aussi

Priorité des opérateurs

Opérateurs courants
affectation incrémentation
décrémentation
arithmétiques logiques comparaison accès membre 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)

Voir aussi

Documentation C++ pour Opérateurs d'assignation