Assignment operators
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
|
|||||||||
où
| 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 :
- à la fois lhs et rhs ont un type compatible de struct ou union , ou..
- rhs doit être implicitement convertible en lhs , ce qui implique
-
- les deux lhs et rhs ont des types arithmétiques , auquel cas lhs peut être volatile -qualifié ou atomic (depuis C11)
- les deux lhs et rhs ont des pointeurs vers des types compatibles (en ignorant les qualificateurs), ou l'un des pointeurs est un pointeur vers void, et la conversion n'ajouterait pas de qualificateurs au type pointé. lhs peut être volatile ou restrict (depuis C99) -qualifié ou atomic (depuis C11) .
- lhs est un pointeur (éventuellement qualifié ou atomic (depuis C11) ) et rhs est une constante de pointeur nul telle que NULL ou une valeur 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 | |||||||||
où
| 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) |
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
| Opérateurs courants | ||||||
|---|---|---|---|---|---|---|
| affectation |
incrémentation
décrémentation |
arithmétiques | logiques | comparaison | accès membre | autres |
|
a
=
b
|
++
a
|
+
a
|
!
a
|
a
==
b
|
a
[
b
]
|
a
(
...
)
|
Voir aussi
|
Documentation C++
pour
Opérateurs d'assignation
|