statement: labeled-statement expression-statement compound-statement selection-statement iteration-statement jump-statement declaration-statement
Hauptunterschied zu C ist das declaration-statement.
int main() { int ende=9999; goto ende; cout << "hallo\n"; ende: cout << "ende " << ende << endl; }
Der Gültigkeitsbereich eines Labels ist die Funktion, in der es definiert ist. Es kann nur in goto-Anweisungen benutzt werden (auch vor seiner Definition). Label-Namen kollidieren nicht mit anderen Bezeichnern.
expression-statement: expression ';' | ';' .
Wertzuweisung und Funktionsaufruf sind Ausdrucksanweisungen (siehe ``Ausdrücke''). Die leere Anweisung ist nützlich für leere Schleifenrümpfe und Labels am Blockende.
compound-statement: '{' statement-list '}' | '{' '}'.
Dient dazu, mehrere Anweisungen dort zu verwenden, wo eine Anweisung erlaubt ist. Besitzt eigenen Gültigkeitsbereich.
selection-statement: 'if' '(' expression ')' statement | 'if' '(' expression ')' statement 'else' statement | 'switch' '(' expression ')' statement .
Erlaubt als expression sind:
Erlaubt als expression sind:
Anweisungen im Rumpf dürfen markiert sein mit ein oder mehreren Labeln der Form:
case constant-expression:
Alle constant-expressions haben verschiedene ganzahlige Werte. Es darf ein Label geben der Form:
default:
Es wird angesprungen, wenn keine der anderen Fallmarken zutrifft.
iteration_statement: 'while' '(' expression ')' statement | 'do' statement 'while '(' expression ')' | 'for' '(' init-stat ';' expropt ';' expropt ')' statement . init-stat: expression-statement | declaration-statement . expropt : expression | .
Erlaubt als expression sind:
Der Test findet statt vor der Ausführung des Rumpfes.
Erlaubt als expression sind:
Der Test findet statt nach der Ausführung des Rumpfes.
int zaehler =0; char c; do { cin >> c; zaehler++; } while (c != '\n');
Erlaubt als erste expression sind:
Der Test (erste expression) findet statt vor der Ausführung des Rumpfes. Danach wird die zweite expression ausgewertet.
Die Initialisierungsanweisung kann eine Deklarationsanweisung sein:
for (int i = 1; i <= MAX; i++) ...
Der Gültigkeitsbereich so definierter Objekte ist auf die for-Schleife beschränkt.
int main() // Schreibe "01230" { int i = 0; for (int i = 0 ; i < 4 ; i ++) cout << i << endl; cout << i << endl; }
jump-statement: 'break' ';' | 'continue' ';' | 'return' expropt ';' | 'goto' identifier .
Wenn Sprünge einen Gültigkeitsbereich verlassen, werden für alle dort konstruierten Objekte (deklarierte und temporäre) die Destruktoren aufgerufen.
erlaubt in switch und Schleifen. Verläßt kleinsten umschliessenden switch oder Schleife.
nur erlaubt in Schleifen. Verzweigt zum Ende des Rumpfes der kleinsten umschliessenden Schleife.
Rückkehr aus einer Funktion.
return ohne Ausdruck erlaubt in:
Sonst ist ein Return-Ausdruck erforderlich. Erreichen des Funktionsendes ohne return ist äquivalent zur Ausführung einer return-Anweisung ohne Ausdruck und daher in Funktionen mit Ergebnistyp verboten.
Unbedingter Sprung zur mit dem angegebenen Label markierten Anweisung. Nur innerhalb einer Funktion.
declaration-statement: declaration.
Deklarationen können beliebig im Anweisungsteil plaziert werden. Verdeckt eventuelle Deklarationen gleichen Namens aus äußeren Blöcken für den Rest des Blockes, in der sie steht.
int main() // gib "(i,j)=(2,1)" aus { int i = 1; { int j = i; int i = 2; cout << "(i,j)=(" << i << "," << j << ")\n"; } }
Im Gegensatz zu C ist es in C++ nicht erlaubt, über eine Deklarationsanweisung mit Initialisierung zu springen, es sei denn sie steht in einem Block, der als Ganzes übersprungen wird:
... goto lx; // FEHLER: überspringt Dekl. ... ly: X a = 0; // Konstruktion von a ... lx: goto ly; // OK: Destruktion von a