C++ Anweisungen: Übersicht __________________________________________________ Programmiertechnik Ein Programm besteht aus Anweisungen (Statements): • Variablen-Definitionen Typ Name = Wert ; Teil 3 • Ausdrücke mit darauf folgendem Semikolon Ausdruck ; C++ Anweisungen: Ausdrücke Operatoren Ablaufsteuerung leere Anweisung: ; • Anweisungsfolgen in geschweiften Klammern { Anweisung Anweisung ... } leere Anweisung: { } • Anweisungen zur Ablaufsteuerung (Kontrollstrukturen) if ( Ausdruck ) Anweisung if ( Ausdruck ) Anweisung else Anweisung switch ( Ausdruck ) Anweisung case Ausdruck : Anweisung default : Anweisung while ( Ausdruck ) Anweisung do Anweisung while ( Ausdruck ) ; for ( Ausdruck ; Ausdruck ; Ausdruck ) Anweisung try { Anweisung ... } catch ( Deklaration ) { Anweisung ... } break ; continue ; return ; return Ausdruck ; throw Ausdruck ; Prof. Dr. H. Drachenfels Fachhochschule Konstanz Version 6.0 31.1.2003 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-1 C++ Ausdrücke: Eigenschaften C++ Operatoren: Eigenschaften __________________________________________________ __________________________________________________ Ein Ausdruck (Expression) liefert einen Wert. Operatoren berechnen einen Wert aus ihren Operanden. • Ein Operator hat eine Stelligkeit: • Elementare Ausdrücke: unäre Operatoren binäre Operatoren ternäre Operatoren Literal Variablenname Funktionsname • Zusammengesetzte Ausdrücke bestehen aus Operatoren, Operanden und Klammern: a = ( b .c + ∗ d ++ + e ) ∗ sizeof f + g ->h [ i ] abhängig von den Eigenschaften der Operatoren (Vorrang und Assoziativität) abhängig von der Klammerung abhängig vom Compiler (!) abhängig von den Operatoren abhängig von den Datentypen der Operanden a + (b ∗ c) Bei gleichem Vorrang ist die Reihenfolge von innen nach aussen bzw. nach Assoziativität. • Ein binärer Operator hat eine Assoziativität: Legt bei mehreren Operatoren gleichen Vorrangs die Auswertungs-Reihenfolge fest. a = b = c bedeutet a = (b = c) Die anderen binären Operatoren sind links-assoziativ, z.B.: Gemischte Datentypen versucht der Compiler durch automatische Typumwandlung anzugleichen. Programmiertechnik bedeutet Zuweisungs-Operatoren sind rechts-assoziativ, z.B.: • Der Datentyp eines Ausdrucks ist Prof. Dr. H. Drachenfels Fachhochschule Konstanz • Ein Operator hat einen Vorrang (Precedence): Legt in Ausdrücken mit mehreren Operatoren die Auswertungs-Reihenfolge fest, z.B.: a + b ∗ c • Die Auswertungs-Reihenfolge eines Ausdrucks ist haben 1 Operanden. haben 2 Operanden. haben 3 Operanden. a + b + c 3-2 Prof. Dr. H. Drachenfels Fachhochschule Konstanz bedeutet Programmiertechnik (a + b) + c 3-3 C++ Operatoren: Zuweisungen C++ Operatoren: Inkrement und Dekrement __________________________________________________ __________________________________________________ Ein Zuweisungs-Operator schreibt einen Wert in einen Speicherbereich. Ein Inkrement- oder Dekrement-Operator ändert einen Wert im Speicher um eine Einheit, d.h. bei Zahltypen um 1, bei Zeigertypen um sizeof (Typ). • Der einfache Zuweisungs-Operator = ersetzt den bisherigen Wert im Speicherbereich, z.B.: • Präfix-Inkrement ++ und -Dekrement -sind Kurzschreibweisen, z.B: Variable = Wert ∗Zeiger = Wert ++ Variable Feld [ Index ] = Wert Variable += 1 bzw. Variable -= 1 Der Datentyp des Ausdrucks insgesamt ist der Datentyp der Variablen. Variable += Wert Der Wert des Ausdrucks insgesamt ist der neue Wert der Variablen. ist eine Kurzschreibweise für Variable = Variable + Wert • Der Datentyp eines Zuweisungs-Ausdrucks insgesamt ist der Datentyp der linken Seite. • Postfix-Inkrement und –Dekrement unterscheiden sich nur beim Wert des Ausdrucks von den Präfix-Entsprechungen: Variable ++ Der Compiler meldet einen Fehler, wenn der Typ der rechten Seite nicht dazu passt! bzw. Variable -- Der Wert des Ausdrucks insgesamt ist der alte (!) Wert der Variablen. • Der Wert eines Zuweisungs-Ausdrucks insgesamt ist der in den Speicher geschriebene Wert. Programmiertechnik -- Variable ist gleichbedeutend mit • Die zusammengesetzten Zuweisungs-Operatoren +=, -=, ∗=, /=, %=, ^=, |=, &=, <<=, >>= ändern den bisherigen Wert im Speicherbereich, z.B.: Prof. Dr. H. Drachenfels Fachhochschule Konstanz bzw. 3-4 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-5 C++ Operatoren: Arithmetik C++ Operatoren: Logik __________________________________________________ __________________________________________________ Arithmetische Operatoren rechnen mit Zahlen*. Logische Operatoren verknüpfen die Wahrheitswerte true und false. • Unäre Vorzeichen-Operatoren für Zahlen +, - • Unärer logischer Operator • Binäre Rechen-Operatoren für Zahlen* +, -, ∗, /, % % ! Modulo nur für ganze Zahlen b ∗ (a / b ) + a % b ist a • Binäre logische Operatoren && logisches Und (auch: and) | | logisches Oder (auch: or) • Unärer Bit-Operator für ganze Zahlen ~ bitweises Komplement (auch: compl) • Der Datentyp eines logischen Ausdrucks ist bool. • Binäre Bit-Operatoren für ganze Zahlen & | ^ bitweises Und (auch: bitand) bitweises Oder (auch: bitor) bitweises exklusives Oder (auch: xor) Als Operanden angegebene Zahlen und Adressen wandelt der Compiler in false, wenn sie den Wert 0 haben, sonst in true. • Der Wert eines logischen Ausdrucks ist die Verknüpfung der gewandelten Operanden. • Der Datentyp eines arithmetischen Ausdrucks ist der größte Datentyp seiner Operanden, mindestens aber int. größter Datentyp = Datentyp mit dem größten Zahlenbereich* • Der Wert eines arithmetischen Ausdrucks ist das Ergebnis der Berechnung. 10 + 12 /∗ Wert ist 22 ∗/ 10 | 12 /∗ Wert ist 14 ∗/ logisches Nicht (auch: not) 10 | | 12 /∗ Wert ist true ∗/ 10 && 12 /∗ Wert ist true ∗/ ! 10 /∗ Wert ist false ∗/ Typischerweise verwendet man logische Operatoren zum Verknüpfen von Vergleichsausdrücke: a > 0 && a < 5 /∗ true für a = 1, 2, 3, 4 ∗/ * zum Rechnen mit Adressen siehe Teil 2 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-6 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-7 C++ Operatoren: Vergleiche C++ Operatoren: Komma __________________________________________________ __________________________________________________ Ein Vergleichs-Operator prüft eine Ordnungsrelation zwischen zwei Werten. Der Komma-Operator bildet eine Ausdrucks-Sequenz. • Syntax: • Der Datentyp eines Vergleichs-Ausdrucks ist bool. Ausdruck1 , Ausdruck2 Der Compiler meldet einen Fehler, wenn die Typen der zu vergleichenden Werte nicht zusammen passen! • Der Datentyp des Ausdrucks insgesamt ist der Datentyp des Ausdrucks hinter dem Komma. • Der Wert eines Zuweisungs-Ausdrucks ist true, wenn die Relation zutrifft, false sonst. • Der Wert des Ausdrucks insgesamt ist der Wert des Ausdrucks hinter dem Komma. • Vorsicht Falle: • Achtung: Nicht jedes Komma in einem C++-Programm ist ein Komma-Operator ! Der Operator für die Gleichheits-Relation wird mit zwei Gleichheitszeichen geschrieben: Variable == 5 /∗ prüft, ob Variable den Wert 5 hat ∗/ int anInt , anotherInt ; Nicht zu verwechseln mit: Variable = 5 Prof. Dr. H. Drachenfels Fachhochschule Konstanz while ( readInt ( & anInt ) , anInt > 0 ) { ... Komma-Operator } /∗ setzt Variable auf den Wert 5 ∗/ Programmiertechnik kein Komma-Operator 3-8 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-9 C++ Operatoren: Bedingung C++ Operatoren: Explizite Typ-Umwandlung __________________________________________________ __________________________________________________ Der dreistellige Bedingungs-Operator bildet eine Ausdrucks-Alternative. Ein Typ-Umwandlungs-Operator erzwingt den Datentyp eines Ausdrucks. • Syntax: • Typ-Konstruktion (Function Style Cast), z.B: Ausdruck1 ? Ausdruck2 : Ausdruck3 • Der Datentyp des Ausdrucks insgesamt ist der gemeinsame Datentyp (nach Typumwandlung) von Ausdruck2 und Ausdruck3. • Der Wert des Ausdrucks insgesamt int ( ) /∗ erzeugt int-Standardwert 0 ∗/ int ( 1.2 ) /∗ erzeugt int-Wert 1 ∗/ • Typ-Umwandlung im ISO-C++-Stil (C++-Cast), z.B.: static_cast< int >( 1.2 ) ist der Wert von Ausdruck2, falls der Wert von Ausdruck1 true (ungleich 0) ist • Typ-Umwandlung im C-Stil (C-Cast), z.B.: ( int ) 1.2 /∗ das selbe wie int(1.2) ∗/ ist der Wert von Ausdruck3, falls der Wert von Ausdruck1 false (gleich 0) ist • Der Bedingungs-Operator ist rechts-assoziativ: a?b:c?d:e Prof. Dr. H. Drachenfels Fachhochschule Konstanz bedeutet Programmiertechnik /∗ das selbe wie int(1.2) ∗/ Achtung: a?b:(c?d:e) Das Ergebnis einer erzwungenen Typ-Umwandlung ist in vielen Fällen Compiler-abhängig. 3-10 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-11 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik – binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts binär rechts ternär rechts binär links binär links binär links binär links binär links 0 1 2 2 2 2 2 2 2 2 2 2 2 3 4 5 6 7 8 3-12 == != < <= > >= << >> + ∗ / % ->∗ .∗ Name Gleichheit Ungleichheit Kleiner Kleiner-gleich Größer Größer-gleich Links-Shift auch: Stream-Ausgabe Rechts-Shift auch: Stream-Eingabe Addition Subtraktion Multiplikation Division Modulo Member-Auswahl Member-Auswahl Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik Vorrang 1 Assoziativität Zuweisung Additions-Zuweisung Subtraktions-Zuweisung Multiplikations-Zuweisung Divisions-Zuweisung Modulo-Zuweisung Bitweise-XOR-Zuweisung Bitweise-Oder-Zuweisung Bitweise-Und-Zuweisung Links-Shift-Zuweisung Rechts-Shift-Zuweisung Bedingung Logisches Oder Logisches Und Bitweises Oder Bitweises XOR Bitweises Und links Stelligkeit = += -= ∗= /= %= ^= |= &= <<= >>= ?: || && | ^ & binär unär Operator Name , Sequenz throw Ausnahme werfen Vorrang __________________________________________________ Assoziativität __________________________________________________ Stelligkeit C++ Operatoren: Zusammenfassung (2) Operator C++ Operatoren: Zusammenfassung (1) binär binär binär binär binär binär binär links links links links links links links 9 9 10 10 10 10 11 binär links 11 binär binär binär binär binär binär binär 12 12 13 13 13 14 14 links links links links links links links 3-13 Name unär – –1 – 15 15 ++ -- Postfix-Inkrement unär Postfix-Dekrement unär ++ -+ ! ~ Präfix-Inkrement Präfix-Dekrement Unäres Plus Unäres Minus Logische Negation –1 –1 –1 –1 –1 –1 15 15 15 15 15 15 . Komponente -> Komponente [ Index ] Bitweise Invertierung unär unär unär unär unär unär & ∗ Adresse Inhalt unär unär –1 –1 15 15 1 Typ-Umwandlung unär – new Typ Erzeugung –2 –1 Vorrang Operator Objektgröße Typgröße (Typ ) Assoziativität Vorrang sizeof sizeof (Typ ) –1 –1 16 16 Auswahl Auswahl Indizierung unär – 1 unär – 1 unär 2 – 1 16 16 16 ( Parameterliste ) Funktionsaufruf unär 2 – 1 16 Typ (Parameterliste ) typeid (Typ ) typeid (Wert ) Typ-Konstruktion Typ-Identifikation Laufzeit-Typinfo –2 – –2 –1 –1 –1 16 16 16 15 const_cast<Typ >( Wert ) Typ-Umwandlung dynamic_cast<Typ >( Wert ) –2 –1 16 15 reinterpret_cast<Typ >(Wert) static_cast<Typ >( Wert ) – – – – 17 17 new Typ ( Paramterliste ) new ( Paramterliste ) Typ new ( ... ) Typ ( ... ) new Typ [Anzahl ] Feld-Erzeugung delete delete [ ] Prof. Dr. H. Drachenfels Fachhochschule Konstanz Zerstörung Feld-Zerstörung Programmiertechnik –2 –1 15 unär unär –1 –1 15 15 3-14 :: Name Name :: Name Scope Resolution Scope Resolution Stelligkeit Assoziativität __________________________________________________ Stelligkeit __________________________________________________ Name C++ Operatoren: Zusammenfassung (4) Operator C++ Operatoren: Zusammenfassung (3) 1 Einstellige Operatoren haben keine Assoziativität. Sie werden von innen nach aussen berechnet. 2 In ( ), [ ] oder < > geklammerte Parameter der Operatoren bleiben bei der Festlegung der Stelligkeit unberücksichtigt. Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-15 C++ Ausdrücke: Auswertungs-Reihenfolge (1) C++ Ausdrücke: Auswertungs-Reihenfolge (2) __________________________________________________ __________________________________________________ • Vorrang, Assoziativität und Klammerung legen die möglichen Auswertungs-Reihenfolgen eines Ausdrucks fest: • Die Auswertungs-Reihenfolge der Operanden eines Operators ist in der Regel Compiler-abhängig. a = ( b . c + ∗ d ++ + e ) ∗ sizeof f + g ->h [ i ] 2 ( a 16 12 15 b 16 12 d .c ) 13 15 e ++ 12 f 16 g i [i] + Reihenfolge wegen Klammerung ∗ + Auswertungs-Reihenfolge in jedem Ast von oben nach unten, aber Reihenfolge zwischen verschiedenen Ästen beliebig. Programmiertechnik • Nur bei den Operatoren ist verbindlich festgelegt, dass der linke Operand vor dem rechten ausgewertet wird. = Prof. Dr. H. Drachenfels Fachhochschule Konstanz Der Compiler darf Code erzeugen, der v [ i ] vor oder nach ++ i auswertet. Komma , Bedingung ? : Logisches Und && Logisches Oder | | sizeof + Reihenfolge wegen LinksAssoziativität i = 0 , v [ i ] = ++ i Je nachdem wird v [ 0 ] oder v [ 1 ] auf 1 setzt ! ->h Reihenfolge wegen Vorrang ∗ 16 Man kann insbesondere nicht erwarten, dass ein Ausdruck von links nach rechts abgearbeitet wird. z.B.: 3-16 Bei den Operatoren && bzw. | | wird der rechte Operand gar nicht ausgewertet, wenn der linke den Wert false bzw. true hat. Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-17 C++ Ablaufsteuerung: Verzweigung Beispiel-Programm Verzweigung __________________________________________________ __________________________________________________ Eine Verzweigung ermöglicht optionale und alternative Anweisungen. • Quellcode: // Liesst zwei Zahlen ein und gibt das Maximum aus • Syntax: #include <iostream> if ( Bedingung ) Anweisung // falls Bedingung erfüllt if ( Bedingung ) Anweisung1 else Anweisung2 int main ( ) { int m, n; // falls Bedingung erfüllt // falls Bedingung nicht erfüllt if ( Bedingung1 ) Anweisung1 else if ( Bedingung2 ) Anweisung2 else Anweisung3 std::cout << "Zwei Zahlen eingeben: " ; if ( ! ( std::cin >> m >> n ) ) { std::cerr << "Eingabefehler !" << std::endl ; } else if ( m > n ) { std::cout << "Maximum: " << m << std::endl ; } else { std::cout << "Maximum: " << n << std::endl ; } // falls Bedingung1 erfüllt // falls nur Bedingung2 erfüllt // falls keine Bedingung erfüllt Eine Bedingung ist ein Ausdruck, dessen Wert sich in true oder false wandeln lässt. • Vorsicht bei geschachtelten Verzweigungen: } Ein else-Teil gehört immer zum letzten noch nicht abgeschlossenen if. Eine andere Zuordnung muss mit geschweiften Klammern erzwungen werden. Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-18 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-19 C++ Ablaufsteuerung: Fallunterscheidung Beispiel-Programm Fallunterscheidung __________________________________________________ __________________________________________________ Die Fallunterscheidung ist eine spezielle Schreibweise für eine mehrfache Verzweigung. • Quellcode: • Syntax: switch ( Ausdruck ) { case Wert1 : Anweisung1 break ; case Wert2 : Anweisung2 break ; default : Anweisung3 } // Gibt die Anzahl der Tage eines Monats aus #include <iostream> int main ( ) { int month; Gleichbedeutend mit: std::cout << "Monat eingeben [1-12]: " ; if ( ! ( std::cin >> month ) | | month < 1 | | month > 12 ) { std::cerr << "Eingabefehler !\n" ; return 1; } if (Ausdruck == Wert1) Anweisung1 else if (Ausdruck == Wert2) Anweisung2 else Anweisung3 switch ( month ) { case 2 : std::cout << "28 oder 29 Tage" << std::endl ; break ; case 4 : case 6 : case 9 : case 11 : std::cout << "30 Tage" << std::endl ; break ; default : std::cout << "31 Tage" << std::endl ; } return 0 ; Der Ausdruck muss ganzzahlige Werte liefern. Die case-Werte müssen verschiedene ganzzahlige Konstanten sein. Die Anweisung des default-Falls wird ausgeführt, wenn der Ausdruck keinen der case-Werte hat. • Vorsicht Falle: Mit break wird die Fallunterscheidung verlassen. Ohne die break-Anweisungen z.B. hinter Anweisung1 würde nach Anweisung1 die Anweisung2 ausgeführt ! } Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-20 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-21 C++ Ablaufsteuerung: Schleifen (1) C++ Ablaufsteuerung: Schleifen (2) __________________________________________________ __________________________________________________ Eine Schleife ermöglicht die wiederholte Ausführung einer Anweisung. Die for-Schleife ist eine spezielle Schreibweise für Schleifen mit Laufvariablen. Schleifen werden häufig benutzt, um Felder oder Listen (allgemein: Aggregate) abzulaufen. Dabei werden die aggregierten Elemente über eine Laufvariable angesprochen. • Syntax der while-Schleife: while ( Bedingung ) Anweisung Wiederholt die Anweisung, solange die Bedingung gilt. • Syntax der do-Schleife: do • Syntax der for-Schleife: for ( Initialisierung ; Bedingung ; Fortschaltung ) Anweisung Gleichbedeutend mit: Gleichbedeutend mit: { Initialisierung ; while ( Bedingung ) { Anweisung while ( Bedingung ) Anweisung Anweisung while ( Bedingung ) ; { Anweisung Fortschaltung ; } } } Führt die Anweisung aus und wiederholt sie dann, solange die Bedingung gilt. Die Initialisierung ist ein Ausdruck, der die Laufvariable auf das erste Element des Aggregats setzt. • Eine Bedingung ist wie gehabt ein Ausdruck, dessen Wert sich in true oder false wandeln lässt. Die Fortschaltung ist eine Ausdruck, der die Laufvariable auf das nächst folgende Element des Aggregats setzt. Die Bedingung prüft, ob alle Elemente besucht wurden. Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-22 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-23 Beispiel-Programm while-Schleife Beispiel-Programm do-Schleife __________________________________________________ __________________________________________________ • Quellcode: • Quellcode: // Liest beliebig viele Zahlen ein und gibt deren Summe aus // Gibt die Zahl 20 binär aus #include <iostream> #include <iostream> int main ( ) { int sum = 0 ; int n ; int main ( ) { int n = 20; std::cout << " " ; // vier Leerzeichen std::cout << "Zahlen eingeben (Ende mit Strg-d):\n" ; do { while ( std::cin >> n ) { sum += n ; } std::cout << n % 2 << "\b\b" ; } while ( ( n /= 2 ) > 0 ) ; std::cout << "Summe: " << sum << std::endl ; std::cout << std::endl ; return 0 ; return 0 ; } } Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-24 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-25 Beispiel-Programm for-Schleife C++ Ablaufsteuerung: Ausnahmen __________________________________________________ __________________________________________________ • Quellcode: // Gibt alle Elemente eines Felds aus Ausnahmebehandlung (Exception Handling) ermöglicht, Ausnahmefälle (das sind in der Regel Fehler) getrennt vom normalen Ablauf zu behandeln. #include <iostream> • Syntax: int main ( ) { const int arraySize = 4 ; int anArray [ arraySize ] = { 5699, 5734, 6056, 6353 } ; for ( int i = 0 ; i < arraySize ; ++ i ) { std::cout << anArray [ i ] << std::endl ; } Anweisungen1 } catch ( Ausnahmedeklaration ) { Anweisungen2 } // normaler Ablauf // Fehlerbehandlung Nach einem try-Block dürfen auch mehrere catch-Blöcke folgen. return 0 ; } • Eine Ausnahmedeklaration ist ein Datentyp oder eine Variablendefinition ohne Initialisierung. • Anmerkung: Die obige Laufvariable i ist nach ISO/ANSI-Standard nur innerhalb der Schleife bekannt, weil sie erst im Schleifenkopf definiert wird. Wird der Wert einer Laufvariablen nach der Schleife noch gebraucht, muss sie vor der Schleife definiert werden. Prof. Dr. H. Drachenfels Fachhochschule Konstanz try { Programmiertechnik Im letzten catch-Block darf die Ausnahmedeklaration statt dessen aus drei Punkten ... bestehen. • Bei einer Ausnahme wird höchstens einer der catch-Blöcke ausgeführt. Die Ausnahmedeklaration muss zum Typ der Ausnahme passen. Die Suche geht dabei von oben nach unten. Drei Punkte passen immer. 3-26 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-27 Beispiel-Programm Ausnahmebehandlung C++ Ablaufsteuerung: Sprünge (1) __________________________________________________ __________________________________________________ • Quellcode: • Eine break-Anweisung springt hinter die umgebende Fallunterscheidung / Schleife: // Speicherüberlauf mit Ausnahmebehandlung abfangen while ( ... ) { ... if ( Bedingung ) break ; ... } #include <iostream> #include <new> // std::bad_alloc int main ( ) { const int einMegaByte = 1 << 20 ; ... // break springt hier hin try { Endlosschleife Manchmal besser als: bool stop = false ; while ( ... && ! stop ) { ... if ( Bedingung ) stop = true ; else ... } Vorsicht Falle: Bei geschachtelten Schleifen wird nur die unmittelbar umgebende Schleife verlassen ! for ( ; ; ) { char ∗ p = new char [ einMegaByte ] ; ∗ p = '\0' ; Löst bei Speicherüberlauf } Ausnahme vom Typ bad_alloc aus } catch ( std::bad_alloc ) { std::cerr << "Kein Speicher mehr!\n" ; return 1 ; } • Eine continue-Anweisung springt zum nächsten Schleifen-Durchlauf, d.h. bei einer do- oder while-Schleife zur Auswertung der Abbruch-Bedingung und bei einer for-Schleife zur Fortschaltung: while ( ... ) { if ( Bedingung ) continue ; ... } return 0 ; } Meistens besser als: while ( ... ) { if ( ! Bedingung ) { ... } } Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-28 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-29 C++ Ablaufsteuerung: Sprünge (2) C++ Anweisungen: Empfehlungen __________________________________________________ __________________________________________________ • Eine return-Anweisung springt an die Aufrufstelle einer Funktion zurück. • Leerzeichen machen Ausdrücke lesbarer, unnötige Klammern nicht unbedingt: Innerhalb von main beendet return das Programm: int main ( ) a + (b ∗ c) // Klammern überflüssig (a + b) ∗ c // Klammern notwendig { return 0 ; // Wert 0 bedeutet erfolgreiches Ende } Genaueres später bei den Funktionen. • Eine throw-Anweisung springt in den nächsten passenden catch-Block. try throw "Hilfe!" ; catch ( const char ∗ ) n = f(i); i ++ ; // besser • Durch Leerzeilen, Klammerung und Einrückung die Blockstruktur der Ablaufsteuerung verdeutlichen: { ... // throw springt hier hin } if ( Bedingung ) { Anweisung } Wenn throw nicht in einem try-Block steht oder hinter dem try-Block kein passender catch-Block steht, wird wie bei return zur Aufrufstelle gesprungen und dort nach einem passenden catch-Block gesucht, usw. while ( ... ) { ... } Wird kein passender catch-Block gefunden, beendet die throw-Anweisung das Programm. Genaueres später bei den Funktionen und Klassen. Programmiertechnik // Seiteneffekt auf i Vereinfacht erheblich die Fehlersuche mit Compiler und Debugger ! } Prof. Dr. H. Drachenfels Fachhochschule Konstanz n = f ( i ++ ) ; • Nur eine Anweisung pro Zeile schreiben. Ausdruck vom Typ const char ∗ passt zum catch-Block { • Ausdrücke mit Seiteneffekten vermeiden: 3-30 Prof. Dr. H. Drachenfels Fachhochschule Konstanz Programmiertechnik 3-31