Rangfolge der Operatoren
In der Tabelle gilt: Operatoren in Gruppe 1 werden vor den Operatoren der Gruppe 2 ausgeführt usw. Einige der Operatoren in der Tabelle dürften im Augenblick noch unbekannt sein. Diese Operatoren werden später behandelt.
Die letzte Spalte Auswertung gibt an, in welcher Reihenfolge die Operanden abgearbeitet werden. So werden z.B. arithmetische Ausdrücke mit gleichrangigen Operanden immer von links nach rechts abgearbeitet, Zuweisungen hingegen rechts nach links.
| Gruppe | Operator | Bedeutung | Auswertung |
|---|---|---|---|
| 1 | :: | Zugriffsoperator | links->rechts |
| 2 | (...) | Funktionsaufruf | links->rechts |
| [...] | Indizierung | ||
| -> und . | Zugriff auf Klassenelement | ||
| ++ und -- | Post-Inkrement/Dekrement | ||
| DTYP(...) | Typkonvertierung | ||
| 3 | ! und ~ | NOT und 1er-Komplement | rechts->links |
| + und - | Vorzeichen | ||
| ++ und -- | Pre-Inkrement/Dekrement | ||
| & | Adressoperator | ||
| * | Dereferenzierungsoperator | ||
| sizeof | Größenoperator | ||
| new und delete | dynamische Speicherverwaltung | ||
| (DTYP)... | Typkonvertierung | ||
| co_wait | Coroutine unterbrechen | ||
| 4 | .* und ->* | Indirekter Zugriff auf Klassenelement | links->rechts |
| 5 | * und / und % | Arithmetische Operatoren | links->rechts |
| 6 | + und - | Arithmetische Operatoren | links->rechts |
| 7 | << und >> | Schiebeoperatoren | links->rechts |
| 9 | < und <= und > und >= |
Vergleichsoperatoren | links->rechts |
| 10 | == und != | Vergleichsoperatoren | links->rechts |
| 11 | & | UND Bitoperator | links->rechts |
| 12 | ^ | EXCLUSIV-ODER Bitoperator | links->rechts |
| 13 | | | ODER Bitoperator | links->rechts |
| 14 | && | logischer UND Operator | links->rechts |
| 15 | || | logischer ODER Operator | links->rechts |
| 16 | ?: | Bedingungsoperator | rechts->links |
| = und *= und /= und = und += und -= und &= und ^= und= und <<= und >>= |
Zuweisungsoperatoren | ||
| throw | Ausnahme auslösen | ||
| co_yield | Coroutine unterbrechen | ||
| 17 | , | Komma-Operator | links->rechts |
Vermeiden Sie so weit wie möglich Anweisungen in folgender Form:
nVar = ++nVar + 1; // oder auch
std::cout << *pcPtr++ << ',' << *pcPtr++ << '\n';
Obwohl die Reihenfolge der Operationen seit C++17 genauer spezifiziert ist, kann das Ergebnis einer Anweisung undefiniert sein, wenn ein Datum innerhalb einer Anweisung (direkt oder indirekt z.B. durch den Aufruf einer Funktion) mehrfach verändert wird! Teilen Sie die Anweisung in mehrere einzelne Anweisungen auf. Wenn Sie mehr zu diesem Thema wissen wollen, suchen Sie im Internet nach den Begriffen side-effects oder sequence-points.