2 Die Bestandteile eines C-Programms

2.1 Der C-Zeichensatz
 
 

Der vom C-Compiler verwendete Zeichensatz besteht aus einem großen Teil des erweiterten ASCII-Zeichensatzes. Allerdings dürfen nicht alle Zeichen uneingeschränkt benutzt werden, da jedes Zeichen für den Compiler eine bestimmte Bedeutung hat. Der gesamte Zeichensatz darf deshalb nur in Zeichenketten oder Kommentaren verwendet werden.
 
 

Bei der Verwendung der Zeichen ist zu beachten, dass C zwischen der Groß- und Kleinschreibung unterscheidet. Im folgenden ist der C-Zeichensatz zusammengestellt:
 
 

Buchstaben : A ... Z und a ... z

Ziffern : 0 1 2 3 4 5 6 7 8 9

Unterstrich : _

Interpunktion : ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ { | } ~
 
 
 
 

Steuerzeichen Escape-Sequenz Bedeutung
 
 

" \"

' \' Nehmen der Sonderbedeutung dieser Zeichen

? \?

\ \\

space Zwischenraum leer lassen (space)

BEL \a akustisches Signal (bell)

BS \b ein Zeichen zurück (backspace)

FF \f neue Seite (formfeed)

NL \n neue Zeile (new line)

CR \r Wagenrücklauf (carriage return)

HT \t horizontaler Tabulator (horizontal tab)

VT \v vertikaler Tabulator (vertical tab)
 
 

Mit "\d", "\dd" oder "\ddd" kann jedes beliebige Zeichen als ein-, zwei- oder dreistellige Oktalzahl dargestellt werden.

Durch "\xh", "\xhh", "\xhhh" ... können beliebig lange Escape-Folgen in hexadezimaler Form dargestellt werden.

Manche Zeichen, die eventuell nicht auf der Tastatur verfügbar sind, können durch sogenannte Trigraph-Zeichen dargestellt werden (Ersatzdarstellung).
 
 

Zeichen Trigraph Zeichen Trigraph

______________________________________________________________

[ ??( { ??<

\ ??/ | ??!

] ??) } ??>

^ ??' ~ ??-

# ??=
 
 

2.2 Token (sinntragende Teile)
 
 

Bezeichner (Namenskonventionen)

Bezeichner sind Namen für Variablen, Funktionen und Marken, die in einem Programm verwendet werden. Sie werden für Funktionen und Variablen deklariert.
 
 

Bezeichner bestehen aus Buchstaben, Ziffern und Unterstrichen. Die Länge der Bezeichner hängt dabei vom verwendeten Compiler ab. Während alte Compiler nur 8 Zeichen unterscheiden können, sind moderne Compiler schon in der Lage, bis zu 31 Zeichen zu unterscheiden. Alle Zeichen die danach folgen, lassen keine weitere Differenzierung mehr zu.
 
 

Für die Bildung von Bezeichnern gelten folgende Regeln:

  1. Namen bestehen aus Buchstaben, Ziffern und Unterstrichen.
  1. Das erste Zeichen eines Bezeichners muss ein Buchstabe sein.
  1. Bezeichner, die mit einem Unterstrich beginnen, sind für das System reserviert.
  1. Bei C wird zwischen Groß- und Kleinschreibung unterschieden
  1. Schlüsselwörter (s. Tabelle 1) dürfen nicht als Bezeichner verwendet werden.

 
 

Beispiele für gültige Bezeichner: a, z, z_2

variable

VARIABLE

Variable
 
 

Beispiele für ungültige Bezeichner: goto

_variable

123_Zahl

wert 1

wert.2
 
 

Weitere Beispiele: Das_ist_ein_langer_Variablenname_1

Das_ist_ein_langer_Variablenname_2
 
 

Im letzten Beispiel stehen zwar zwei Bezeichner, die sich in einem Zeichen unterscheiden, allerdings ist die Anzahl der signifikanten Stellen überschritten. Für den Compiler handelt es sich deshalb um ein und dieselbe Variable.
 
 
 
 

Schlüsselwörter

Bei den Schlüsselwörtern handelt es sich um vordefinierte Namen mit besonderer Bedeutung. Sie dürfen, wie im vorangegangenen Kapitel schon erwähnt, nicht als Bezeichner für Variablen benutzt werden, da sie für das System reserviert sind.
 
 

Insgesamt sind in ANSI-C 32 Schlüsselwörter enthalten. Im Anhang unter 8.1 sind alle Schlüsselwörter von ANSI-C aufgeführt. In verschiedenen Compilern können es noch einige Schlüsselwörter mehr sein.
 
 

Kommentare

Kommentare sind Texteile eines Programms, die vom Compiler ignoriert werden. Zu diesem Zweck werden sie von den Zeichen /* und */ eingeschlossen. Kommentare können an beliebiger Stelle im Quellcode stehen. Sie können sich auf eine Programmzeile beschränken oder sich über mehrere erstrecken.

Die Verwendung von Kommentaren beeinflusst die Laufzeit eines compilierten Programms nicht.
 
 

Beispiel: /* Das ist eine Kommentarzeile. */
 
 

/* Dieser Kommentar erstreckt sich über mehrere

Zeilen. Wird das Kommentarendezeichen

vergessen, kann es zu Problemen führen. */
 
 

Trennungen

Bei der Umwandlung wird ein Quellprogramm durch den Compiler in kleine Gruppen von Zeichen, sogenannten Token, aufgebrochen. Diese Zeichen bilden zusammen eine logische Einheit. Für den Compiler hat jedes Token eine Bestimmte Bedeutung und wird dementsprechend interpretiert.
 
 

Beispiele für Token sind Operatoren, Bezeichner, Konstanten und Schlüsselworte. Damit sie als Token erkannt werden können, müssen sie von einem anderen Token durch ein Trennzeichen abgeschlossen werden. Als Trennzeichen können verschiedene Sonderzeichen Verwendung finden. Beispielsweise [ ], { }, ( ), < >, usw. Dabei ist das Leerzeichen das wohl am häufigsten benutzte Trennzeichen.
 
 

Wird auf die Verwendung von Leerzeichen verzichtet, so werden die Programme unübersichtlich und schlecht lesbar. In diesem Fall wird dann die Ausführung der Operatoren durch ihre Priorität und die Reihenfolge ihres Auftretens bestimmt.
 
 

Beispiel: i+++j;
 
 

Das Beispiel zeigt, dass beim Verzichten von Trennzeichen die Eindeutigkeit verloren gehen kann. Vom Compiler wird der Ausdruck i+++j als (i++) + (j) interpretiert, obwohl der Programmierer vielleicht die Formel (i) + (++j) berechnen lassen wollte.
 
 

Deshalb sollten in Zweifelsfällen immer Klammern und Leerzeichen an den entsprechenden Stellen verwendet werden.
 
 

Konstanten und Variablen

Unter einer Konstanten wird eine Zahl, ein Zeichen oder ein String verstanden. Sie kann im Programm als feststehender Wert betrachtet werden.
 
 
 
 

In C wird dabei zwischen den folgenden Typen von Konstanten unterschieden:

  1. Ganzzahlkonstanten vom Typ int
  1. Gleitkommakonstanten vom Typ float oder double
  1. Zeichenkonstanten vom Typ char
  1. Zeichenkettenkonstanten vom Typ char (Feld)
  1. Aufzählungskonstanten vom Typ int

Die Konstanten vom Typ char sind einzeln in Anführungszeichen zu setzen. Unterschieden wird zwischen Zeichenkonstanten, wie z.B. 'a', 'Z', '1', und Zeichenkettenkonstanten, wie z.B. "ABC". Zeichenkonstanten müssen in einfache Hochkommas, Zeichenkettenkonstanten in doppelte Hochkommas gesetzt werden.
 
 

Oktale Ganzzahlkonstanten können durch Voranstellen einer 0 (Null), hexadezimale durch Voranstellen der Zeichenkombination 0x bzw. 0X dargestellt werden.
 
 

Die Darstellung von long-int- und long-float-Konstanten wird durch Anhängen von L bzw. l, unsigned-Konstanten durch Anhängen von U bzw. u erreicht.
 
 

Beispiel: 10 dezimal integer

017 oktal integer

0x7A hexadezimal integer

0X12L hexadezimal long integer
 
 
 
 
 
 

2.3 Blöcke, Anweisungen und Ausdrücke
 
 

Ein C-Programm besteht aus einer Menge von Funktionen, mindestens aber aus der Funktion mit dem Namen main. Nach dem Funktionsnamen und den runden Klammern, die die Argumentliste enthält, folgt ein Block (Verbundanweisung).

Blöcke enthalten Vereinbarungen und Anweisungen. Blöcke können auch beliebig geschachtelt werden.
 
 

Anweisungen sind Ausdrücke, die mit einem Semikolon abgeschlossen sind.
 
 

Ein Ausdruck ist eine Folge von Operanden und Operatoren. Operanden sind Funktionsaufrufe, Variable, Konstanten oder wiederum Ausdrücke.
 
 
 
 

2.4 Die Speicherklassen in C
 
 

Der Ort und die Lebensdauer von Bezeichnern wird durch ihre Speicherklasse bestimmt. In C stehen dem Programmierer insgesamt 4 Speicherklassen zur Verfügung:

  1. auto
  1. static
  1. extern und
  1. register.

Variablen der Speicherklasse auto sind bei jedem lokalen Aufruf eines Blocks vorhanden. Nach Verlassen des Blocks werden die Variablen wieder eliminiert.
 
 

Variablen die der Speicherklasse static angehören, sind nur lokal in einem Block vorhanden. Ihr Wert bleibt jedoch auch nach Verlassen des Blocks erhalten.
 
 

Damit Variablen während des gesamten Programms existieren und ihre Werte behalten, steht die Speicherklasse extern zur Verfügung.
 
 

Mit register können Variablen in den Hardwareregistern, soweit dies möglich ist, gehalten werden. Ansonsten gilt das Gleiche wie für die Variablen der Speicherklasse auto.
 
 

Wird die Angabe der Speicherklasse weggelassen, wird die Variable standardmäßig der Klasse auto zugeordnet.

Beispiele: int i;

auto int j;

static int e;
 
 

Das Beispiel zeigt eine Anwendung der Speicherklassen. Die Variablen i und j werden der Speicherklasse auto zugeordnet. Wird der Block, in dem sie definiert wurden, verlassen, verlieren sie ihre Werte. Die Variable e dagegen behält auch nach Verlassen des Blocks ihren Wert, da sie der Speicherklasse static angehört.