8.1 Konstanten

Literale Konstanten besitzen einen Typ und einen Inhalt. Der Typ ergibt sich aus der Schreibweise, wie im Folgenden beschrieben ist.

Zudem gibt es benannte Konstanten, die sich zusätzlich durch einen Namen auszeichnen. Sie werden definiert wie Variablen, aber zusätzlich mit dem Schlüsselwort const deklariert und sind damit nach der Vereinbarung nicht mehr änderbar. Siehe dazu auch Attributangaben.

Den Wert von Konstanten darf man durch Zuweisungen o. ä. nicht ändern7.

Mit der Ausnahme von Stringkonstanten haben alle Konstanten einen einfachen Datentyp. Stringkonstanten haben einen zusammengesetzten Datentyp, nämlich ein Feld vom einfachen Typ char, also den Typ char[].

Ganzzahlige Konstanten schreibt man meist als Dezimalzahl. 123 ist beispielsweise eine solche Konstante.

Vorwiegend bei systemnaher Programmierung tut man sich mit oktaler oder sedezimaler (oder: hexadezimaler) Schreibweise (zur Zahlenbasis 8 bzw. 16) manchmal leichter. Oktale Konstanten beginnt man mit der Ziffer 0, also etwa 0312. Das ist oktal und entspricht der Dezimalzahl $(3*8*8 + 1*8 + 2) = 202$ (dezimal). Oktalkonstanten dürfen natürlich nur die Ziffern 0-7 beinhalten (zumindest in ANSI-C; in K&R-C waren 8 und 9 als Oktalziffern teilweise erlaubt).

Sedezimalzahlen beginnt man mit einer der Zeichenfolgen 0x oder 0X. Als Ziffern braucht man dazu 16 verschiedene Zeichen. Dafür nimmt man 0-9 und a-f oder wahlweise A-F. A und a entsprechen dabei dem Wert 10, B und b dem Wert 11, C und c dem Wert 12, D und d dem Wert 13, E und e dem Wert 14 und F und f dem Wert 15. Beispielsweise ist 0x75af eine Sedezimalkonstante und entspricht der Dezimalzahl $(7*16*16*16 + 5*16*16 + 10*16 + 15) = 30127$.

Binäre Zahlen kann man leider nicht im Quelltext angeben.

In der Regel wird eine dezimal geschriebene ganzzahlige Konstante als Konstante mit dem Typ signed int angesehen. Ist sie jedoch so groß, daß sie über den Wertebereich von signed int hinausgeht, dann wird sie automatisch als unsigned int (aber nur, wenn sie sedezimal oder oktal angegeben ist), oder long int oder unsigned long int behandelt.

Bei kleineren Zahlen kann man das Attribut unsigned erzwingen, indem man an die Konstante den Buchstaben u oder U anhängt. Ebenso kann man durch Anhängen von l oder L den Typ long erzwingen, mit ul entsprechend unsigned long.
12ul ist also eine unsigned long-Konstante mit dem Wert 12.

Aufzählungen: Man kann an Konstanten vom Typ int Namen vergeben, indem man sie in einer enum-Liste aufführt. Beispiel:

enum farbe
{
    rot,
    gruen,
    blau
};

enum farbe col;

main()
{
    col = blau;

    printf( "col ist %d\n", col );
}
vereinbart drei int-Konstanten, nämlich rot mit dem Wert 0, gruen mit dem Wert 1 und blau mit dem Wert 2. Gleichzeitig wird der Datentyp enum farbe vereinbart, der damit als int zu verstehen ist. Mit diesem Datentyp wird in der folgenden Zeile eine Variable col vereinbart. Dieser wird in main() der Wert 2 zugewiesen (blau).

In obigem Beispiel ist wahrscheinlich beabsichtigt, daß die Variable col nur die Werte 0, 1 und 2 beziehungsweise rot, gruen und blau annehmen kann. Tatsächlich ist col vom Typ int und kann damit auch alle anderen Werte annehmen, ohne daß der Compiler dies verhindern würde. Die Zuweisung col=25; wäre also zulässig, aber wohl unsinnig.

Will man keinen Datentyp enum soundso schaffen, dann kann man auch den Namen (hier: farbe) weglassen:

enum
{
    rot,
    gruen,
    blau
};

int col;

main()
{
    col = blau;

    printf( "col ist %d\n", col );
}

Wenn nichts anderes angegeben wird, dann erhält die erste Konstante in der enum-Liste den Wert 0 und alle anderen Konstanten erhalten den um eins erhöhten Wert des Vorgängers. Diese Vorgabe kann man aber übersteuern, indem man einige oder alle Werte angibt:

enum
{
    rot=3,
    gruen,
    blau=10
};
Hier wird rot als 3 vereinbart, gruen als 4 (eins mehr als der Vorgänger rot) und blau als 10.

Konstanten vom Typ char kann man schreiben, indem man das entsprechende Zeichen in Apostrophen einschließt. Die Konstante 'A' ist dafür ein Beispiel. Eine char-Konstante hat einen Zahlenwert, welcher der Position des Zeichens in der verwendeten Zeichensatztabelle entspricht. Bei den meisten Rechnern ist dies der ASCII-Zeichensatz, wo ein 'A' den Wert 65 hat. Etliche Zeichen kann man nicht über die Tastatur in den Quelltext eingeben; dafür kann man dann Sonderdarstellungen verwenden:

Zeichen Schreibweise
Zeilenvorschub, Zeilentrenner '\n'
Alarmzeichen '\a'
Tabulatorzeichen '\t'
Vertikaltabulator '\v'
backspace '\b'
carriage return '\r'
Seitenvorschub (form feed) '\f'
linker Schrägstrich (back slash) '\\'
Fragezeichen '\?'
Apostroph '\''
Gänsefüßchen '\"'

Jedes beliebige Zeichen kann man auch mit seiner oktalen oder sedezimalen Position im Zeichensatz angeben. Oktal gibt man dafür nach dem linken Schrägstrich maximal 3 oktale Ziffern (0-7) ein, wie: '\40' ist im ASCII-Zeichensatz das Leerzeichen ' ', da es an der Position 32 (dezimal) beziehungsweise 20 (sedezimal) oder 40 (oktal) steht. Die sedezimale Darstellung beginnt mit \x und enthält danach maximal 2 sedezimale Ziffern, z.B. '\x20'.

Achtung! Diese Positionen sind aber abhängig vom verwendeten Rechnersystem, während die Darstellungen '\n' bis '\"' in obiger Tabelle rechnerunabhängig sind.

Stringkonstanten sind Konstanten, die den Typ char[] haben, also ein Feld von char-Werten. Die benötigte Länge des Feldes ist immer (Anzahl der angegebenen Zeichen +1). Die um 1 größere Länge kommt daher, daß an den eigentlichen String noch ein Nullbyte angehängt wird, also das Zeichen '\0'. Damit wird das Ende des Strings markiert. Beispiel: "abc" ist eine Stringkonstante mit 4 Elementen vom Typ char, nämlich 'a', 'b', 'c' und '\0'. In den String dürfen die Steuerzeichen und Sonderzeichen, die bei char-Konstanten beschrieben wurden, eingestreut werden: "a\\b\n" besteht aus 5 Zeichen, nämlich 'a', dem linken Schrägstrich '\\', 'b', einem Zeilenvorschubzeichen '\n' und der abschließenden '\0'.

Achtung: Die Zeichen '0' und '\0' haben nichts miteinander zu tun!

'0'
ist das Zeichen im jeweiligen Zeichensatz, welches bei der Ausgabe die Ziffer 0 repräsentiert. Im ASCII-Zeichensatz ist dies das Zeichen mit der Nummer 48.

'\0'
dagegen ist das Zeichen an der ersten Position, also die Position 0. Bei den meisten Zeichensätzen kann '\0' gar nicht dargestellt werden. Sonst könnte man es in C auch nicht als Stringende verwenden, denn wie sollte man das Zeichen dann in einem String auf den Bildschirm bringen, wenn es doch das Ende der Zeichenkette signalisiert?

Nach ANSI-C8 kann man mehrere Stringkonstanten hintereinanderschreiben; der Compiler faßt diese dann zu einer zusammen und hängt erst hinter die letzte die abschließende Null. Dies ist ganz nützlich, um in einem Quelltext einen String mit Praeprozessordirektiven zusammenzusetzen.

Beispiel:

#define  DATEINAME      "TEST.DAT"
    /* ... */
    FILE *f;

    f = fopen( DATEINAME, "r" ); /* Datei oeffnen                   */

    if( !f )                     /* Oeffnen hat nicht geklappt      */
    {
        puts( "Die Datei " DATEINAME " kann ich nicht oeffnen!" );
    }
    /* ... */

An der Stelle, an der puts() aufgerufen wird, wird vom Praeprozessor der Text DATEINAME ersetzt durch ¨TEST.DAT¨. Die Anweisung

puts( "Die Datei " "TEST.DAT" " kann ich nicht oeffnen!" );
wird übersetzt wie
puts( "Die Datei TEST.DAT kann ich nicht oeffnen!" );
da die drei Strings im Argument zu einem zusammengefaßt werden.

Wenn man in die Parameterliste einer Funktion eine Stringkonstante oder ein anderes Feld schreibt, dann wird tatsächlich nicht das Feld an die Funktion übergeben, sondern stattdessen ein Zeiger auf das erste Element des Feldes.

Vorsicht! 'A' und "A" sind grundverschiedene Konstanten! 'A' ist eine Zeichenkonstante, also ein einzelnes Zeichen. "A" dagegen ist ein Feld vom Typ char (,,nullterminierter String``) mit 2 Zeichen; und zwar dem Zeichen 'A' und einem anschließenden Nullbyte.

Konstanten vom Typ double (doppelt genaue Gleitkommazahlen) schreibt man als Ziffernfolge mit Dezimalpunkt und/oder Zehnerexponent. Beispiele:

und so fort. Mit dem Zusatz f oder F erzwingt man eine Konstante einfacher Genauigkeit (float, z. B. 1.23456F); mit dem Zusatz l oder L eine solche mit dem Typ long double.

AnyWare@Wachtler.de