Namespaces
Variants

Assignment operators

From cppreference.net

Zuweisungs- und kombinierte Zuweisungsoperatoren sind binäre Operatoren, die die Variable zu ihrer linken Seite unter Verwendung des Werts zu ihrer rechten Seite modifizieren.

Operator Operatorname Beispiel Beschreibung Entspricht
= Grundlegende Zuweisung a = b a wird gleich b N/A
+ = Additionszuweisung a + = b a wird gleich der Addition von a und b a = a + b
- = Subtraktionszuweisung a - = b a wird gleich der Subtraktion von b von a a = a - b
* = Multiplikationszuweisung a * = b a wird gleich dem Produkt von a und b a = a * b
/ = Divisionszuweisung a / = b a wird gleich der Division von a durch b a = a / b
% = Modulo-Zuweisung a % = b a wird gleich dem Rest von a geteilt durch b a = a % b
& = Bitweise UND-Zuweisung a & = b a wird gleich dem bitweisen UND von a und b a = a & b
| = Bitweise ODER-Zuweisung a | = b a wird gleich dem bitweisen ODER von a und b a = a | b
^ = Bitweise XOR-Zuweisung a ^ = b a wird gleich dem bitweisen XOR von a und b a = a ^ b
<<= Bitweise Linksschiebe-Zuweisung a <<= b a wird gleich a linksverschoben um b a = a << b
>>= Bitweise Rechtsschiebe-Zuweisung a >>= b a wird gleich a rechtsverschoben um b a = a >> b

Inhaltsverzeichnis

Einfache Zuweisung

Die einfachen Zuweisungsoperatorausdrücke haben die Form

lhs = rhs

wo

lhs - modifiable lvalue Ausdruck eines beliebigen vollständigen Objekttyps
rhs - Ausdruck eines beliebigen Typs, implizit konvertierbar zu lhs oder kompatibel mit lhs

Die Zuweisung führt eine implizite Konvertierung vom Wert von rhs zum Typ von lhs durch und ersetzt dann den Wert in dem durch lhs bezeichneten Objekt durch den konvertierten Wert von rhs .

Die Zuweisung gibt auch denselben Wert zurück, der in lhs gespeichert wurde (sodass Ausdrücke wie a = b = c möglich sind). Die Wertkategorie des Zuweisungsoperators ist Non-Lvalue (sodass Ausdrücke wie ( a = b ) = c ungültig sind).

rhs und lhs müssen eines der folgenden Kriterien erfüllen:

  • sowohl lhs als auch rhs haben arithmetische Typen , in welchem Fall lhs möglicherweise volatile -qualifiziert sein kann oder atomic (seit C11)
  • sowohl lhs als auch rhs haben Zeiger auf kompatible (Qualifizierer ignorierende) Typen, oder einer der Zeiger ist ein Zeiger auf void, und die Konvertierung würde keine Qualifizierer zum Zieltyp hinzufügen. lhs kann volatile oder restrict (seit C99) -qualifiziert sein oder atomic (seit C11) .
  • lhs ist ein (möglicherweise qualifizierter oder atomic (seit C11) ) Zeiger und rhs ist eine Nullzeiger-Konstante wie NULL oder ein nullptr_t -Wert (seit C23)
  • lhs hat den Typ (möglicherweise qualifiziert oder atomic (seit C11) ) _Bool und rhs ist ein Zeiger oder ein nullptr_t Wert (seit C23)
(seit C99)
(seit C23)

Hinweise

Wenn rhs und lhs sich im Speicher überlappen (z.B. wenn sie Mitglieder derselben Union sind), ist das Verhalten undefiniert, es sei denn, die Überlappung ist exakt und die Typen sind kompatibel .

Obwohl Arrays nicht zuweisbar sind, ist ein in einer Struktur verpacktes Array einem anderen Objekt desselben (oder kompatiblen) Strukturtyps zuweisbar.

Die Nebenwirkung der Aktualisierung von lhs ist sequenziert nach den Wertberechnungen, aber nicht den Nebenwirkungen von lhs und rhs selbst, und die Auswertungen der Operanden sind wie üblich unsequenziert relativ zueinander (daher sind Ausdrücke wie i = ++ i ; undefiniert)

Zuweisung entfernt zusätzlichen Bereich und Präzision von Gleitkomma-Ausdrücken (siehe FLT_EVAL_METHOD ).

In C++ sind Zuweisungsoperatoren Lvalue-Ausdrücke, nicht so in C.

#include <stdio.h>
int main(void)
{
    // Ganzzahlen
    int i = 1, j = 2, k = 3; // Initialisierung, keine Zuweisung
    i = j = k;   // Werte von i und j sind nun 3
//  (i = j) = k; // Fehler: Lvalue erforderlich
    printf("%d %d %d\n", i, j, k);
    // Zeiger
    const char c = 'A'; // Initialisierung; keine Zuweisung
    const char *p = &c;  // Initialisierung; keine Zuweisung
    const char **cpp = &p; // Initialisierung; keine Zuweisung
//  cpp = &p;   // Fehler: char** ist nicht konvertierbar zu const char**
    *cpp = &c;  // OK, char* ist konvertierbar zu const char*
    printf("%c \n", **cpp);
    cpp = 0;    // OK, Nullzeigerkonstante ist zu jedem Zeiger konvertierbar
    // Arrays
    int arr1[2] = {1,2}, arr2[2] = {3, 4};
//  arr1 = arr2; // Fehler: Kann keinem Array zuweisen
    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: Kann in Strukturen eingebettete Arrays zuweisen
    printf("%d %d \n", sam1.arr[0], sam1.arr[1]);
}

Ausgabe:

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

Zusammengesetzte Zuweisung

Die zusammengesetzten Zuweisungsoperatorausdrücke haben die Form

lhs op rhs

wo

op - einer von * = , / = % = , + = - = , <<= , >>= , & = , ^ = , | =
lhs , rhs - Ausdrücke mit arithmetischen Typen (wobei lhs qualifiziert oder atomar sein kann), außer wenn op gleich + = oder - = ist, die auch Zeigertypen mit denselben Einschränkungen wie + und - akzeptieren

Der Ausdruck lhs @= rhs ist exakt dasselbe wie lhs = lhs @ ( rhs ) , mit der Ausnahme, dass lhs nur einmal ausgewertet wird.

Wenn lhs einen atomic -Typ hat, verhält sich die Operation wie eine einzelne atomare Lese-Modifizieren-Schreibe-Operation mit Speicherreihenfolge memory_order_seq_cst .

Für ganzzahlige atomare Typen ist die zusammengesetzte Zuweisung @ = äquivalent zu:

T1* addr = &lhs;
T2 val = rhs;
T1 old = *addr;
T1 new;
do { new = old @ val } while (!atomic_compare_exchange_strong(addr, &old, new);
(seit 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;
}

Ausgabe:

10 100 10 50
10 1000 1 0

Referenzen

  • C17-Standard (ISO/IEC 9899:2018):
  • 6.5.16 Zuweisungsoperatoren (S: 72-73)
  • C11-Standard (ISO/IEC 9899:2011):
  • 6.5.16 Zuweisungsoperatoren (S: 101-104)
  • C99-Standard (ISO/IEC 9899:1999):
  • 6.5.16 Zuweisungsoperatoren (S. 91-93)
  • C89/C90 Standard (ISO/IEC 9899:1990):
  • 3.3.16 Zuweisungsoperatoren

Siehe auch

Operatorpräzedenz

Häufige Operatoren
Zuweisung Inkrement
Dekrement
Arithmetik Logisch Vergleich Mitgliederzugriff Sonstige

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
(seit C11)
(bis C23)

alignof
(seit C23)

Siehe auch

C++ Dokumentation für Zuweisungsoperatoren