Statements
Statements sind Fragmente des C++-Programms, die in Sequenz ausgeführt werden. Der Körper jeder Funktion ist eine Sequenz von Statements. Zum Beispiel:
int main() { int n = 1; // Deklarationsanweisung n = n + 1; // Ausdrucksanweisung std::cout << "n = " << n << '\n'; // Ausdrucksanweisung return 0; // Rückgabewert-Anweisung }
C++ beinhaltet die folgenden Arten von Anweisungen:
- Markierte Anweisungen
- Ausdrucksanweisungen
- Zusammengesetzte Anweisungen
- Auswahlanweisungen
- Schleifenanweisungen
- Sprunganweisungen
| (seit C++26) |
| (TM TS) |
Inhaltsverzeichnis |
Markierte Anweisungen
Eine markierte Anweisung kennzeichnet eine Anweisung für Kontrollflusszwecke.
| Label-Anweisung | |||||||||
| label | - | das auf die Anweisung angewandte Label (unten definiert) |
| statement | - | die Anweisung, auf die das Label angewendet wird; es kann selbst eine gelabelte Anweisung sein, was mehrere Labels ermöglicht |
Beschriftungen
label ist definiert als
attr
(optional)
identifier
:
|
(1) | ||||||||
attr
(optional)
case
constexpr
:
|
(2) | ||||||||
attr
(optional)
default:
|
(3) | ||||||||
|
Eine Attribut -Sequenz attr kann entweder am Anfang der Marke erscheinen (in diesem Fall gilt sie für die Marke), oder direkt vor einer Anweisung selbst, in welchem Fall sie für die gesamte Anweisung gilt. |
(seit C++11) |
Eine Marke mit einem Bezeichner, der innerhalb einer Funktion deklariert ist, passt auf alle goto-Anweisungen mit demselben Bezeichner in dieser Funktion, in allen geschachtelten Blöcken, vor und nach ihrer eigenen Deklaration.
Zwei Labels in einer Funktion dürfen nicht denselben Bezeichner haben.
|
Neben der Verwendung in Anweisungen können Labels auch an beliebiger Stelle in Verbundanweisungen verwendet werden. |
(since C++23) |
Labels werden nicht durch unqualified lookup gefunden: Ein Label kann denselben Namen wie jede andere Entität im Programm haben.
void f() { { goto label; // Label im Gültigkeitsbereich, obwohl später deklariert label: // Label kann seit C++23 eigenständig am Ende eines Blocks erscheinen } goto label; // Label ignoriert Blockgültigkeitsbereich } void g() { goto label; // Fehler: Label nicht im Gültigkeitsbereich von g() }
Kontrollflussbegrenzte Anweisungen
Die folgenden Anweisungen sind control-flow-limited statements :
- Die compound-statement eines try -Blocks .
- Die compound-statement eines Handlers .
|
(seit C++17) |
|
(seit C++23) |
Für jede kontrollflussbeschränkte Anweisung
S
:
-
Alle
goto
Ziel-Labels, die in
Sdeklariert sind, können nur von Anweisungen inSreferenziert werden. -
Jedes
case
- oder
default
-Label, das in
Serscheint, kann nur mit einer switch -Anweisung innerhalb vonSassoziiert werden.
Ausdrucksanweisungen
Ein Ausdrucksstatement ist ein Ausdruck gefolgt von einem Semikolon.
attr
(optional)
expression
(optional)
;
|
|||||||||
| attr | - | (since 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 Anweisung ohne Ausdruck wird als null statement bezeichnet. Sie wird häufig verwendet, um einen leeren Rumpf für eine for - oder while -Schleife bereitzustellen. Sie kann auch verwendet werden, um eine Markierung am Ende einer zusammengesetzten Anweisung zu tragen. (bis C++23)
Zusammengesetzte Anweisungen
Eine zusammengesetzte Anweisung oder ein Block gruppiert eine Folge von Anweisungen zu einer einzelnen Anweisung.
attr
(optional)
{
statement...
(optional)
label...
(optional)
(seit C++23)
}
|
|||||||||
Wenn eine Anweisung erwartet wird, aber mehrere Anweisungen sequenziell ausgeführt werden müssen (zum Beispiel in einer if -Anweisung oder einer Schleife), kann ein zusammengesetzter Anweisungsblock verwendet werden:
if (x > 5) // Anfang der if-Anweisung { // Anfang des Blocks int n = 1; // Deklarationsanweisung std::cout << n; // Ausdrucksanweisung } // Ende des Blocks, Ende der if-Anweisung
Jede zusammengesetzte Anweisung führt ihren eigenen Blockgültigkeitsbereich scope ein; Variablen, die innerhalb eines Blocks deklariert werden, werden an der schließenden Klammer in umgekehrter Reihenfolge zerstört:
int main() { // Anfang des äußeren Blocks { // Anfang des inneren Blocks std::ofstream f("test.txt"); // Deklarationsanweisung f << "abc\n"; // Ausdrucksanweisung } // Ende des inneren Blocks, f wird geleert und geschlossen std::ifstream f("test.txt"); // Deklarationsanweisung std::string str; // Deklarationsanweisung f >> str; // Ausdrucksanweisung } // Ende des äußeren Blocks, str wird zerstört, f wird geschlossen
|
Ein Label am Ende eines zusammengesetzten Anweisungsblocks wird so behandelt, als ob ihm eine leere Anweisung folgen würde. |
(since C++23) |
Auswahlanweisungen
Eine Auswahlanweisung wählt zwischen einem von mehreren Kontrollflüssen.
attr
(optional)
if constexpr
(optional)
(
init-statement
(optional)
condition
)
statement
|
(1) | ||||||||
attr
(optional)
if constexpr
(optional)
(
init-statement
(optional)
condition
)
statement
else
statement
|
(2) | ||||||||
attr
(optional)
switch (
init-statement
(optional)
condition
)
statement
|
(3) | ||||||||
attr
(optional)
if !
(optional)
consteval
compound-statement
|
(4) | (seit C++23) | |||||||
attr
(optional)
if !
(optional)
consteval
compound-statement
else
statement
|
(5) | (seit C++23) | |||||||
Iterationsanweisungen
Eine Iterationsanweisung führt einen Codeabschnitt wiederholt aus.
attr
(optional)
while (
condition
)
statement
|
(1) | ||||||||
attr
(optional)
do
statement
while (
expression
)
;
|
(2) | ||||||||
attr
(optional)
for (
init-statement condition
(optional)
;
expression
(optional)
)
statement
|
(3) | ||||||||
attr
(optional)
for
(
init-statement
(optional)
(since C++20)
for-range-decl
:
for-range-init
)
statement
|
(4) | (since C++11) | |||||||
Sprunganweisungen
Eine Sprunganweisung überträgt die Kontrollflusssteuerung bedingungslos.
attr
(optional)
break;
|
(1) | ||||||||
attr
(optional)
continue;
|
(2) | ||||||||
attr
(optional)
return
expression
(optional)
;
|
(3) | ||||||||
attr
(optional)
return
braced-init-list
;
|
(4) | (seit C++11) | |||||||
attr
(optional)
goto
identifier
;
|
(5) | ||||||||
Hinweis: Bei allen Sprunganweisungen beinhaltet das Verlassen einer Schleife, eines Blocks oder das Zurückspringen über eine initialisierte Variable mit automatischer Speicherdauer die Zerstörung von Objekten mit automatischer Speicherdauer, die an der Stelle, von der gesprungen wird, im Gültigkeitsbereich sind, aber nicht an der Stelle, zu der gesprungen wird. Falls mehrere Objekte initialisiert wurden, erfolgt die Zerstörung in umgekehrter Reihenfolge der Initialisierung.
Assertion-AnweisungenEine Vertragsassertion.
1)
contract_assert
-Anweisung.
|
(seit C++26) | |||||||||||||||||||||||
Deklarationsanweisungen
Eine Deklarationsanweisung führt einen oder mehrere Bezeichner in einen Block ein.
| block-declaration | (1) | ||||||||
try Blöcke
Ein try -Block fängt Ausnahmen ab, die bei der Ausführung anderer Anweisungen geworfen werden.
attr
(optional)
try
compound-statement handler-sequence
|
(1) | ||||||||
Atomare und synchronisierte BlöckeEin atomarer und synchronisierter Block stellt Transaktionsspeicher bereit.
1)
Synchronisierter Block
, ausgeführt in einer einzigen Gesamtreihenfolge mit allen synchronisierten Blöcken;
2)
Atomarer Block
, der bei Exceptions abbricht;
3)
Atomarer Block
, der bei Exceptions ein Rollback durchführt;
4)
Atomarer Block
, der bei Exceptions committet.
|
(TM TS) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Unteranweisungen
Ein Unterstatement einer Anweisung ist eines der Folgenden:
- Für eine markierte Anweisung , ihre statement .
- Für eine zusammengesetzte Anweisung , jede Anweisung ihrer statement... .
- Für eine Auswahlanweisung , jede ihrer statement oder compound-statement (since C++23) .
- Für eine Schleifenanweisung , ihre statement .
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 Auswahlanweisung oder Schleifenanweisung, und S2 ist die init-statement von S1 .
- S1 ist ein try Block , und S2 ist entweder dessen compound-statement oder der compound-statement eines beliebigen Handlers in dessen handler-seq .
- S1 umschließt eine Anweisung S3 und S3 umschließt S2 .
Eine Anweisung S1 wird umschlossen von einer Anweisung S2 genannt, wenn S2 die Anweisung S1 umschließt.
Siehe auch
|
C-Dokumentation
für
Statements
|