Anweisungen
Anweisungen sind Fragmente eines C++-Programms, die nacheinander ausgeführt werden. Der Körper jeder Funktion ist eine Sequenz von Anweisungen. Zum Beispiel
int main() { int n = 1; // declaration statement n = n + 1; // expression statement std::cout << "n = " << n << '\n'; // expression statement return 0; // return statement }
C++ enthält die folgenden Arten von Anweisungen
- Beschriftete Anweisungen
- Ausdrucksanweisungen
- Compound statements
- Selektionsanweisungen
- Iterationsanweisungen
- Sprunganweisungen
| (seit C++26) |
| (TM TS) |
Inhalt |
[bearbeiten] Beschriftete Anweisungen
Eine beschriftete Anweisung beschriftet eine Anweisung zu Kontrollflusszwecken.
| Label-Anweisung | |||||||||
| Label | - | Das Label, das auf die Anweisung angewendet wird (definiert unten) |
| Anweisung | - | Die Anweisung, auf die das Label angewendet wird; es kann selbst eine beschriftete Anweisung sein, was mehrere Labels ermöglicht. |
[bearbeiten] Labels
Label ist definiert als
attr (optional) Bezeichner : |
(1) | ||||||||
attr (optional) case constexpr : |
(2) | ||||||||
attr (optional) default: |
(3) | ||||||||
|
Eine Attributsequenz attr kann entweder direkt am Anfang des Labels stehen (in diesem Fall bezieht sie sich auf das Label) oder direkt vor der Anweisung selbst, in diesem Fall bezieht sie sich auf die gesamte Anweisung. |
(seit C++11) |
Ein Label mit einem Bezeichner, der innerhalb einer Funktion deklariert wird, entspricht allen goto-Anweisungen mit demselben Bezeichner in dieser Funktion, in allen verschachtelten Blöcken, vor und nach seiner eigenen Deklaration.
Zwei Labels in einer Funktion dürfen nicht denselben Bezeichner haben.
|
Neben der Hinzufügung zu einer Anweisung können Labels auch überall in zusammengesetzten Anweisungen verwendet werden. |
(seit C++23) |
Labels werden nicht durch unqualifizierte Suche gefunden: Ein Label kann denselben Namen wie jede andere Entität im Programm haben.
void f() { { goto label; // label in scope even though declared later label: // label can appear at the end of a block standalone since C++23 } goto label; // label ignores block scope } void g() { goto label; // error: label not in scope in g() }
[bearbeiten] Kontrollflussbeschränkte Anweisungen
Die folgenden Anweisungen sind kontrollflussbeschränkte Anweisungen
- Die zusammengesetzte_Anweisung eines try-Blocks.
- Die zusammengesetzte_Anweisung eines Handlers.
|
(seit C++17) |
|
(seit C++23) |
Für jede kontrollflussbeschränkte Anweisung S
- Alle in
Sdeklarierten goto-Ziel-Labels können nur von Anweisungen inSreferenziert werden. - Jedes Label vom Typ case oder default, das innerhalb von
Serscheint, kann nur mit einer switch-Anweisung innerhalb vonSassoziiert werden.
[bearbeiten] Ausdrucksanweisungen
Eine Ausdrucksanweisung ist ein Ausdruck, gefolgt von einem Semikolon.
attr (optional) Ausdruck (optional) ; |
|||||||||
| attr | - | (seit C++11) optionale Sequenz beliebig vieler Attribute |
| expression | - | Ein Ausdruck |
Die meisten Anweisungen in einem typischen C++-Programm sind Ausdrucksanweisungen, wie Zuweisungen oder Funktionsaufrufe.
Eine Ausdrucksanweisung ohne Ausdruck wird als Null-Anweisung bezeichnet. Sie wird oft verwendet, um einen leeren Körper für eine for- oder while-Schleife bereitzustellen. Sie kann auch verwendet werden, um ein Label am Ende einer zusammengesetzten Anweisung zu tragen.(bis C++23)
[bearbeiten] Zusammengesetzte Anweisungen
Eine zusammengesetzte Anweisung oder ein Block gruppiert eine Sequenz von Anweisungen zu einer einzigen Anweisung.
attr (optional) { Anweisung... (optional) Label... (optional)(seit C++23) } |
|||||||||
Wenn eine einzelne Anweisung erwartet wird, aber mehrere Anweisungen nacheinander ausgeführt werden müssen (z. B. in einer if-Anweisung oder einer Schleife), kann eine zusammengesetzte Anweisung verwendet werden.
if (x > 5) // start of if statement { // start of block int n = 1; // declaration statement std::cout << n; // expression statement } // end of block, end of if statement
Jede zusammengesetzte Anweisung führt ihren eigenen Block- Gültigkeitsbereich ein; Variablen, die innerhalb eines Blocks deklariert werden, werden an der schließenden Klammer in umgekehrter Reihenfolge zerstört.
int main() { // start of outer block { // start of inner block std::ofstream f("test.txt"); // declaration statement f << "abc\n"; // expression statement } // end of inner block, f is flushed and closed std::ifstream f("test.txt"); // declaration statement std::string str; // declaration statement f >> str; // expression statement } // end of outer block, str is destroyed, f is closed
|
Ein Label am Ende einer zusammengesetzten Anweisung wird behandelt, als ob ihm eine Null-Anweisung folgen würde. |
(seit C++23) |
[bearbeiten] Selektionsanweisungen
Eine Selektionsanweisung wählt zwischen einem von mehreren Kontrollflüssen.
attr (optional) if constexpr(optional) ( init-statement (optional) Bedingung ) Anweisung |
(1) | ||||||||
attr (optional) if constexpr(optional) ( init-statement (optional) Bedingung ) Anweisung else Anweisung |
(2) | ||||||||
attr (optional) switch ( init-statement (optional) Bedingung ) Anweisung |
(3) | ||||||||
attr (optional) if !(optional) consteval zusammengesetzte_Anweisung |
(4) | (seit C++23) | |||||||
attr (optional) if !(optional) consteval zusammengesetzte_Anweisung else Anweisung |
(5) | (seit C++23) | |||||||
[bearbeiten] Iterationsanweisungen
Eine Iterationsanweisung wiederholt die Ausführung eines Codes.
attr (optional) while ( Bedingung ) Anweisung |
(1) | ||||||||
attr (optional) do Anweisung while ( Ausdruck ) ; |
(2) | ||||||||
attr (optional) for ( init-statement Bedingung (optional) ; Ausdruck (optional) ) Anweisung |
(3) | ||||||||
attr (optional) for ( init-statement (optional)(seit C++20) for-range-decl : for-range-init ) Anweisung |
(4) | (seit C++11) | |||||||
[bearbeiten] Sprunganweisungen
Eine Sprunganweisung überträgt den Kontrollfluss bedingungslos.
attr (optional) break; |
(1) | ||||||||
attr (optional) continue; |
(2) | ||||||||
attr (optional) return Ausdruck (optional) ; |
(3) | ||||||||
attr (optional) return braced-init-list ; |
(4) | (seit C++11) | |||||||
attr (optional) goto Bezeichner ; |
(5) | ||||||||
Hinweis: Bei allen Sprunganweisungen führt der Transfer aus einer Schleife, aus einem Block oder zurück über eine initialisierte Variable mit automatischer Speicherdauer zur Zerstörung von Objekten mit automatischer Speicherdauer, die an der Stelle des Transfers im Gültigkeitsbereich liegen, aber nicht an der Zielstelle. Wenn mehrere Objekte initialisiert wurden, ist die Reihenfolge der Zerstörung die umgekehrte Reihenfolge der Initialisierung.
Assertion-AnweisungenEine Vertrags-Assertion.
1)
contract_assert-Anweisung. |
(seit C++26) | |||||||||||||||||||||||
[bearbeiten] Deklarationsanweisungen
Eine Deklarationsanweisung führt einen oder mehrere Bezeichner in einen Block ein.
| Block-Deklaration | (1) | ||||||||
[bearbeiten] try-Blöcke
Ein try-Block fängt Ausnahmen ab, die beim Ausführen anderer Anweisungen ausgelöst werden.
attr (optional) try zusammengesetzte_Anweisung Handler-Sequenz |
(1) | ||||||||
Atomare und synchronisierte BlöckeEin atomarer und synchronisierter Block bietet transaktionalen Speicher.
1) synchronisierter Block, ausgeführt in totaler Einzelreihenfolge mit allen synchronisierten Blöcken;
2) atomarer Block, der bei Ausnahmen abbricht;
3) atomarer Block, der bei Ausnahmen zurückrollt;
4) atomarer Block, der bei Ausnahmen committet.
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
[bearbeiten] Unteranweisungen
Eine Unteranweisung einer Anweisung ist eine der folgenden:
- Für eine beschriftete Anweisung ihre Anweisung .
- Für eine zusammengesetzte Anweisung jede Anweisung ihrer Anweisung... .
- Für eine Selektionsanweisung eine beliebige ihrer Anweisung oder zusammengesetzte_Anweisung (seit C++23).
- Für eine Iterationsanweisung ihre Anweisung .
Eine Anweisung S1 umschließt eine Anweisung S2, wenn eine der folgenden Bedingungen erfüllt ist:
- S2 ist eine Unteranweisung von S1.
- S1 ist eine Selektions- oder Iterationsanweisung, und S2 ist die init-statement von S1.
- S1 ist ein try-Block und S2 ist entweder seine zusammengesetzte_Anweisung oder die zusammengesetzte_Anweisung eines beliebigen Handlers in seiner handler-seq .
- S1 umschließt eine Anweisung S3 und S3 umschließt S2.
Eine Anweisung S1 wird von einer Anweisung S2 umschlossen, wenn S2 S1 umschließt.
[bearbeiten] Siehe auch
| C-Dokumentation für Anweisungen
|