Programmiertechnik Teil 3 C++ Anweisungen:

Werbung
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
Herunterladen