| Axel Rogat |
| Objektorientiertes Programmieren mit C++ und JAVA |
|   |
2.2: Aufbau
| Kapitel 2 |
3.1: Vordefinierte Typen 
|
|   |
|   | 2.3 Lexikalische Elemente |   |
|   |
Kommentare dürfen nicht geschachtelt werden (auch
wenn einige Compiler das optional zulassen). Das bringt Probleme mit sich,
wenn sich "echte" Kommentare in einem Programmteil befinden, der nur
kurzfristig auskommentiert werden soll.
Kommentare im C++-Stil beginnen mit // und reichen bis
zum Ende der Zeile. Solche Kommentare sollte man immer bevorzugen und Kommentare
im alten Stil benutzen, um Programmteile vorübergehend auszublenden.
Längere Programmteile, die C-Kommentare enthalten, kann man mit
Hilfe des Präprozessors ausblenden:
Das Vorgehen, das Programm zunächst in solche Teile zu zerlegen, führt
nicht nur zu einer Vereinfachung der Compiler. Für unsere Zwecke ist es
wichtig, daß sie es überhaupt ermöglicht, die Sprache mit einer
überschaubaren Anzahl von Regeln zu definieren.
Leerzeichen, Zeilenvorschübe, etc. ("whitespace")
sowie Kommentare werden vom Scanner bereits ausgesiebt und zählen bei uns
nicht mehr zu den Tokens.
Zwischen den Tokens ist beliebig whitespace erlaubt. Prinzipiell kann
das gesamte C-Programm (von Präprozessor-Zeilen abgesehen) in
einer einzigen Zeile stehen. Whitespace muß überhaupt nur gesetzt
werden, um mehrere aufeinanderfolgende Bezeichner bzw. Konstanten, die mit einer
Ziffer beginnen, eindeutig voneinander zu trennen.
Wir unterscheiden vier Klassen von lexikalischen Einheiten:
Lexikalische Einheiten der letzten beiden Klassen besitzen zusätzlich ein
Attribut "Name", bzw. "Wert".
ANSI-C besitzt folgende 32 Schlüsselwörter, die
ohne (oder ohne große -- s.o.) Bedeutungsänderung auch in C++ verwendbar
sind:
Durch die ersten C++-Sprachentwürfe wurde die Liste durch folgende
neue Schlüsselwörter erweitert:
Außerdem gab es zwischenzeitlich das Schlüsselwort overload,
das mittlerweile aber wieder überflüssig geworden ist. Es wird aber
(inklusive der zugehörigen Syntax) oft noch akzeptiert.
In den neueren Sprachentwürfen mit Templates, Exception-Handling,
Namespaces und neuen Cast-Operatoren kamen schließlich noch folgende
hinzu (Warnung: insbesondere solche, die ein Unterstrich-Zeichen enthalten):
Folgende Zeichen, bzw. Zeichenkombinationen in C++ (und
ANSI-C) sind eigene Tokens, sogenannte "Interpunktionszeichen":
Dezimalkonstanten: (1|...|9)(0|...|9)*
Oktalkonstanten: 0(0|...|7)*
Hexadezimalkonstanten:
(0x|0X)(0|...|9|A|...|F|a|...f)+
Ist die Konstante zu groß für den "größten"
Integer-Typ, wird eine Fehlermeldung ausgegeben.
1234u ist damit unsigned int (wogegen 1234 meistens
automatisch int ist).
Auf den meisten Maschinen ist
0xDADAcafe vom Typ unsigned long und hat den gleichen Wert
wie 033266545376lu und
3671771902UL (und die gleiche interne Darstellung wie
-623195394l).
Nachkommastellen oder Exponententeil können entfallen, aber nicht beide
(zur Unterscheidung von Integer-Konstanten).
Normalerweise sind diese Konstanten vom Typ double. Wenn sie vom Typ
float oder long double sein sollen (weniger genau oder
besonders genau, mehr dazu später), muß dies durch eine Endung
f, F, bzw. l, L gekennzeichnet werden.
Integer-Konstanten können durch diese Endungen nicht zu
Gleitkommakonstanten gemacht werden (1F ist nicht erlaubt,
1.F schon).
Mit Z=0|...|9 (und µ=leeres Wort) erhält man folgenden
regulären Ausdruck für die Darstellung:
Wenn ein einzelnes Zeichen eingeschlossen wird, hat die Konstante
den Typ char. Achtung: bei ANSI-C hätte sie den Typ
int!
char ist ein normaler Integer-Typ, und der Wert der Konstanten
als Integer-Zahl entspricht dem Code des Zeichens im verwendeten
Zeichencode, meist ASCII.
Beispiel: '*' hat den Integer-Wert 42.
Spezialzeichen und die nicht erlaubten Zeichen lassen sich in
Zeichenkonstanten wie folgt durch Escape-Sequenzen ersetzen:
Mit speziellen Escape-Sequenzen lassen sich beliebige Zeichencodes in
Zeichenkonstanten einbauen. Dazu wird der Backslash von einer
entsprechenden Oktal- oder Hexadezimal-Konstante gefolgt (diese
Konstante reicht bis zum ersten Zeichen, das keine Oktal- bzw.
Hexadezimalziffer ist).
Beispielsweise ist '\x2a' die gleiche Zeichenkonstante wie
'*'. '\x1b' entspricht auf den meisten Systemen
ESCAPE.
Zeichenkonstanten mit zwei Zeichen ('xl')
sind vom Typ int und dürfen nicht etwa mit Zeichenketten
verwechselt
werden. Ihre Werte sind implementationsabhängig. Sie hängen
meistens von der Reihenfolge der Bytes einer Mehr-Byte-Zahl im
Speicher ab, z.B. 'xl'=0x6c78 oder 'xl'=0x786c.
Es gibt einen weiteren Zeichen-Typ wchar_t ("wide character"),
der in vielen Compilern aber noch nicht implementiert ist. Er ist gedacht
für Zeichensätze mit mehr als 256 Zeichen (z.B. Unicode,
siehe dazu
den JAVA-Teil). Konstanten dieses Typs beginnen mit L',
z.B. L'xl'. Entsprechende Compiler behandeln
zweistellige Literale mit und ohne L gleich.
2.3.1 Kommentare
Kommentare im C-Stil werden mit /* eingeleitet und mit
*/ beendet. Dazwischen ist eine Kette aus beliebigen ASCII-Zeichen
erlaubt, die nicht */ enthält.
2.3.2 Tokens
Unter lexikalischen Einheiten verstehen wir die kleinsten Einheiten, aus
denen sich ein C++-Programm zusammensetzt. Das sind nicht die
ASCII-Zeichen auf der Quelltext-Ebene, sondern die "Tokens", die der erste
Teil des Compilers, der Scanner, erkennt und an die weiteren Teile des
Compilers weitergibt.
Schlüsselwörter
(z.B. if, else, const)
Spezialzeichen
(Interpunktionszeichen und Operatoren,
z.B. <= oder ... oder ->*)
Bezeichner
(z.B. wert, Ziffer123,
ein_ziemlich_langer_name)
Literalkonstanten
(z.B. -1 oder
2.99792458e+8 oder '{' oder
"Hello World!")
auto default float register struct
volatile
break do for return switch
while
case double goto short typedef
char else if signed union
const enum int sizeof unsigned
continue extern long static void
asm delete inline operator protected
this
class friend new private public
virtual
bool explicit namespace throw
typename
catch export reinterpret_cast true
using
const_cast false static_cast try
wchar_t
dynamic_cast mutable template typeid
; { } , ( ) <
> : = ...
2.3.3 Literalkonstanten
Hierunter fallen Konstanten zu den in C++ schon vordefinierten Typen.
Hier haben wir einen Sonderfall vor uns. Der Typ bool
kann genau zwei Werte annehmen, die als Konstanten mit den
Schlüsselwörtern true und false
bezeichnet werden. (Der Typ ist neu gegenüber ANSI-C).
Die verschiedenen Integer-Typen werden später genau besprochen.
Integer-Literale sind in C++ immer positiv.
Damit ist -1 also ein Ausdruck mit dem unären Operator
- und der Konstanten 1.
Sie dürfen also nicht mit einer führenden 0 beginnen!
Sie müssen mit der Ziffer 0 beginnen;
0 ist also eine Oktalkonstante.
Beispiele: 07=7, 010=8,
0100=64, 011111=4681.
Beispiele:
0x1=1, 0Xa=10, 0x10=16, 0Xff=255,
0xffffffff=4294967295.
Gleitkommakonstanten können nur in dezimaler Schreibweise
angegeben werden. Sie sind nach dem üblichen Muster 1.23E-45
aufgebaut. Auch sie sind immer positiv.
Eine Zeichenkonstante besteht aus einem oder zwei in Hochkommata
' eingeschlossenen Zeichen. Nicht erlaubt sind dabei der
Backslash \, das Hochkomma selber und Zeichen wie Tabulator,
Zeilenvorschub, etc.
\a Alarm (Bell) \r Return
\? ?
\b Backspace \t Tabulator \' '
\f Formfeed \v vert. Tab. \" "
\n NewLine \\ \
|   |
2.2: Aufbau
| Startseite |
3.1: Vordefinierte Typen 
|
|   |