|
Form | Zeichen |
---|
Buchstaben | A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k 1 m n o p q r s t u v w x y z | Ziffern | 0 1 2 3 4 5 6 7 8 9 | Unterstrich | _ | Sonderzeichen | ! " # % & ' ( ) * + , - . / : ; < = > ? [ \ ] ^ { | } ~ |
Neben den sichtbaren Zeichen verfügt C noch über weitere Zeichen:
Zeichen | Bedeutung |
---|
Leertaste | Space, Leerzeichen | Warnung | BEL, Klingel, Signalton |
Backspace | BS, Rückschritt |
Formfeed | FF, Sprung zum nächsten Seitenanfang |
Newline | NL, Zeilenende, "Line Feed", Zeilenvorschub |
Return | CR, "Carriage Return", Sprung zum Anfang der aktuellen Zeile |
Tab | HT, Horizontaler Tabulator |
Sie sehen, daß die nationalen Sonderzeichen, wie z. B. Umlaute, nicht zum Zeichensatz
von C gehören. Diese können jedoch in Literalen (Strings) auftauchen.
Die oben vorgestellten weiteren Zeichen des Zeichensatzes in C werden durch
Escape-Sequenzen realisiert. Diese Technik wird weiter unten vorgestellt.
Namen bestehen in C aus Buchstaben, Ziffern und dem Unterstrich. Sie dürfen
nicht mit einer Ziffer beginnen.
Trennzeichen
Das Leerzeichen, Zeilenende, die Tabulatoren, Seitenvorschub und Kommentare sind
Trennzeichen. Sie trennen die Grundelemente der Sprache. Mehrere dieser Trennzeichen
hintereinander werden als ein Trennzeichen angesehen. Folgt einem Backslash (\) ein
Zeilenendezeichen, dann wird eine logische Zeile gebildet:
Das \
ist eine logische Zeile
Formatfreiheit
Der Programmtext wird in C ohne Zeilennummern und formatfrei eingegeben. Trotz dieser
Formatfreiheit sollten Sie Ihre Programme so gestalten, daß sie von Menschen gelesen
und verstanden werden können. Aus den vorgestellten Programmen ist eine gewisse, vom
Autor frei gewählte, Konvention erkennbar. Andere Autoren haben vergleichbare
Gewohnheiten, entscheiden Sie sich für eine.
Kommentare
Die Informationen zur Programmdokumentation werden in einem Kommentar untergebracht.
Dieser wird mit /* eingeleitet und mit */ beendet. Ein Kommentar kann
über mehrere Zeilen gehen.
Diese Möglichkeit ist nicht nur zum Kommentieren wichtig, sondern auch zum
Einkreisen von Fehlern. Verdächtiger Kode mit /* und */ eingekreist
und der Fehler möglicherweise umzingelt.
Kommentare dürfen nicht geschachtelt werden.
Diese Einschränkung ist dann unangenehm, wenn Sie Programmtext "auskommentieren", d.
h. außer Kraft setzen wollen. Sie müssen dann nämlich darauf achten,
daß Sie nicht zufällig Kommentare mit einschließen. Daher lassen
manche Compilerhersteller auch verschachtelte Kommentare zu.
Es gibt Compiler, die // als Kommentarbeginn zulassen, Kommentarende ist
dann das Ende der Zeile.
Compilerdirektive #include
Durch diese Anweisung an den Compiler werden weitere Dateien in den Quelltext eingebunden.
Es handelt sich in der Regel um sogenannte "Headerdateien" (siehe unten). Beispiel:
#include <stdio.h>
Durch diese Compilerdirektive wird der Inhalt der Datei stdio.h dem Quelltext
hinzugefügt. Die Lage der Headerdateien im Dateisystem des Rechners ist über
Compiler-Voreinstellungen festgelegt. Meist heißt das Verzeichnis auch "include".
Eine Weitere Form der include-Anweisung ist:
#include "myfile.h"
Hier wird normalerweise in aktuellen Verzeichnis gesucht. Man kann bei der Headerdatei
auch einen Dateipfad angeben.
Headerdateien
Die Datei stdio.h ist durch die Endung ".h" als Headerdatei erkennbar. Headerdateien
werden am Kopf (englisch head = Kopf) des Quelltextes eingefügt. Die Headerdatei
mit dem Namen stdio.h wird somit vom Compiler eingelesen. Hier stehen wichtige
Informationen über den Aufbau von Funktionen, die im Programmlauf aufgerufen
werden. Diese Headerdateien sind reine Textdateien, Sie können den Inhalt mit
einem Editor untersuchen.
In den Headerdateien findet der Compiler Prototypen, Präprozessor-Makros und
symbolische Konstanten. Prototypen sind Muster für die Verwendung von
Funktionen. Der Präprozessor wird vor dem eigentlichen Compilationsvorgang
gestartet, er ersetzt Makros im Text durch einen anderen Text. Weiterhin werden
häufig verwendete Konstanten, wie z. B. EOF, definiert.
Die Kodierung für die angesprochenen Funktionen befindet sich in Bibliotheken,
die beim Linken dem compilierten Programm hinzugebunden werden. Durch die
Headerdateien wird der Compiler beruhigt: Es fehlt nichts, die weiteren Informationen
folgen beim Linken (= Zusammenbinden mehrerer binärer Objektdateien zu einem
Programm).
Das Semikolon
In C muß jede Anweisung mit einem Semikolon (;) abgeschlossen werden.
In Pascal, zum Vergleich, trennt das Semikolon zwei Anweisungen.
Funktionen
Es gibt in C kein besonderes Hauptprogramm (wie in Pascal oder anderen Sprachen).
Für jedes C-Programm ist main() die Hauptfunktion. Hier beginnt der
prozedurale Teil. Da main() eine Funktion ist, können Argumente
übergeben werden. Weiterhin kann dem aufrufenden Programm ein Ergebnis
geliefert werden. In diesem Fall wird nichts übergeben und nichts
zurückgeliefert. Das Nichts kann in C auch void genannt werden.
Innerhalb der Funktion main() befindet sich der Anweisungsblock,
der mit "{" eingeleitet und mit "}" beendet wird. Das ist ein allgemeines Prinzip:
Anweisungsblöcke werden durch geschweifte Klammern zusammengefaßt.
main() wird auch im Programm nur definiert, aber nicht aufgerufen. Sie werden
niemals einen Befehl main(); in einem C-Programm finden. main()
hat eine Sonderstellung: Es handelt sich um die Funktion, die beim Programmstart auf
jeden Fall ausgeführt wird.
Die Funktion main() liefert bei einem erfolgreichen Programmlauf den Wert Null
als Ergebnis. Manche Compiler verlangen, daß am Ende von main()
ausdrücklich ein Rückgabewert angegeben wird. Ergänzen Sie dann
das Programm nach der letzten Anweisung, also vor der letzten geschweiften Klammer, um
die Anweisung:
return (0)
oder
return 0
Mit dieser Angabe kann das Betriebssystem, das das Programm gestartet hat,
überprüfen, ob das aufgerufene Programm ordnungsgemäß beendet
worden ist. Im Fehlerfall wird ein Wert ungleich Null zurückgegeben.
Standardbibliotheken
Die Standardfunktionen werden von Standardbibliotheken zur Verfügung gestellt.
Die folgenden Headerdateien stellen die Verbindung zu den Standardbibliotheken her,
wobei die folgende Tabelle nur ein Auszug aus allen verfügbaren Headerdateien
ist:
Bibliothek | Aufgabenbereiche |
assert.h | Überprüfung von Bedingungen |
ctype.h | Typkonvertierungen und Typtests |
errno.h | Behandlung von Systemfehlern |
float.h | Fließkomma-Bibliothek |
limits.h | Grenzen für Datentypen |
locale.h | Verwaltung der lokalen Struktur |
math.h | mathematische Funktionen |
signal.h | Prozeßsteuerung |
stddef.h | Standardkonstanten |
stdio.h | Standardeingabe und -ausgabe |
stdlib.h | Standardbibliotheksfunktionen |
string.h | Funktionen zur Stringverarbeitung |
time.h | Zeitmanagement |
Beim Programmieren in C verwenden Sie entweder die oben angebotenen Standardfunktionen
oder selbstdefinierte Funktionen oder Sie beziehen vollständige
Funktionsbibliotheken für alle nur denkbaren Anwendungsgebiete. Damit ist
C so leistungsfähig, daß sowohl Betriebssysteme als auch beliebige
Anwendungen programmiert werden können.
Schlüsselwörter
Die Schlüsselwörter einer Programmiersprache haben eine vordefinierte
Bedeutung, diese kann nicht geändert werden. Hier eine _bersicht:
auto | double | int | struct |
break | else | long | switch |
case | enum | register | typedef |
char | extern | return | union |
const | float | short | unsigned |
continue | for | signed | void |
default | goto | sizeof | volatile |
do | if | static | while |
Für C ist der Unterschied zwischen Groß- und Kleinschreibung wichtig.
Die Schlüsselwörter müssen also genauso geschrieben werden, wie sie
vorgestellt worden sind. Diese Schlüsselwörter bilden den Kern der
Programmiersprache C.
Bezeichner und Namen
In C (nicht in C++) ist ein Objekt ein Speicherbereich, der aus einer
zusammenhängenden Folge von einem oder mehreren Bytes bestehen muß.
Mit Bezeichnern werden Objekte identifiziert. Dabei gelten die folgenden Regeln:
- Ein Bezeichner besteht aus einer Folge von Buchstaben, Ziffern oder dem
Unterstrich (_), das erste Zeichen darf keine Ziffer sein.
- Ein Bezeichner darf beliebig lang sein, es ist jedoch nur eine bestimmte
Länge signifikant.
- Schlüsselwörter dürfen nicht als Bezeichner genommen werden.
Auch hier gilt, daß zwischen Groß- und Kleinschreibung unterschieden
wird. Namen sind Bezeichner von Variablen, Funktionen und Marken.
Escape-Sequenzen
In der Zeile
printf("Hello World!\n");
finden Sie die Escape-Sequenz \n, die den Cursor zum Anfang der nächsten
Zeile bewegt (bzw. auf dem Drucker eine neue Zeile beginnt). Nichtdruckbare Zeichen
werden über solche Escape-Sequenzen, eingeleitet durch "\" in den Programmtext
eingefügt (meist, für die Ein- und Ausgabe oder in Strings).
Hier eine Übersicht über einige Escape-Sequenzen:
Zeichen | Escape-Sequenz | Bedeutung |
" | \" | Anführungszeichen |
' | \' | Apostroph |
? | \? | Fragezeichen |
\ | \\ | Backslash |
BEL | \a | Bell |
BS | \b | Backspace |
FF | \f | Formfeed |
NL | \n | Newline |
CR | \r | Carriage Return |
HT | \t | Horizontal-Tabulator |
VT | \v | Vertical-Tabulator |
Einführendes Beispiel
Dies ist wohl eines der bekanntesten C-Programme:
#include <stdio.h> /* header file '... .h' */
int main(void) /* Hauptprogramm 'main()' */
{ /* Beginn ... */
printf("Hello world!\n"); /* schreibt "..." auf stdout */
return 0; /* alles okay ... */
} /* ... Ende Block */
Anmerkungen:
- C unterscheidet zwischen Groß- und Kleinbuchstaben (case sensitev);
- Kommentare (bzw. allg. Zeichen, die der Compiler ignorieren soll)
werden in /* */ eingeschlossen; dies kann auch über Zeilen hinweg
geschehen.
Vorsicht: Kommentare dürfen nicht
geschachtelt werden!
- Programm besteht aus Ausdrücken, die durch ';' terminiert
sind (sog. "Statements" oder "Anweisungen");
#include <stdio.h>
int main(void)
{
int n, m; /* Deklaration der Variablen
'n' und 'm' als integer */
printf("2 ganze Zahlen eingeben: ");
scanf("%d%d", &n, &m); /* Werte einlesen von stdin */
printf("\nSumme von %d und %d: %d\n",
n, m, n+m); /*Ergebnis*/
return 0;
}
Anmerkungen:
- Das Hauptprogramm heißt immer main(); formal ist das
eine Funktion, deshalb int main(void) oder
int main(int argc, char **argv);
- main() sollte immer einen Wert zurückgeben;
- Am Beginn eines Blockes (Block: spezifiziert durch '{' und '}')
müssen die hierin verwendeten Variablen deklariert werden (soweit dies
nicht schon außerhalb geschehen ist); dies geschieht jeweils durch Angabe
des Datentyps, gefolgt vom Namen der Variablen.
- Es ist üblich, Klammerebenen durch Einrücken zu verdeutlichen.
- Die Funktion printf dient der Ausgabe von Text und Inhalten
von Variablen auf den Bildschirm (stdout); dazu ist die Angabe des
gewünschten Formats nötig; die Formatangabe hat die
Form %format.
- Zum Einlesen von Werten wird die Funktion scanf verwendet;
die obigen Formatangaben sind im Wesentlichen die gleichen wie bei
printf.
Außerdem muß dem Variablennamen in der Parameterliste von scanf
ein '&' voranstehen (tatsächlich werden nämlich die Adressen
der Variablen übergeben).
Damit haben Sie auch schon eine wichtige Kontrollstruktur kennengelernt.
Als Block wird bezeichnet, was in einem Klammerpaar
{ } eingeschlossen ist.
Ein solcher Block faßt die in ihm enthaltenen Statements zu einem
sog. "Compound-Statement" zusammen; dies ist syntaktisch äquivalent zu
einem einzelnen Statement. Blöcke verfügen über bemerkenswerte
Eigenständigkeit: innerhalb jedes Blockes können lokale Variablen
deklariert werden. Beispiel:
int i=3;
{
int i=4;
printf("%d", i); /* output: 4 */
}
printf("%d", i); /* output: 3 */
Noch ein Beispiel: Vorstellung einfacher Datentypen und ihrer Ausgabe mit
printf(); Verwendung der Zuweisung und der arithmetischen
Operatoren +, -, *, / und %.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* Beachten Sie: Innerhalb eines Paares geschweifter Klammern */
/* immer zuerst alle benoetigten lokalen Variablen deklarieren */
/* und dann die Anweisungen schreiben. */
/* Deklaration der (lokalen) Variablen */
int i,ii; /* printf-Format: %d */
short int h,hh; /* printf-Format: %hd */
long int l,ll; /* printf-Format: %ld */
char c,cc; /* printf-Format: %c */
float f,ff; /* printf-Format: %f | %e | %g */
double d,dd; /* printf-Format: %lf | %le | %lg */
long double q,qq; /* printf-Format: %Lf | %Le | %Lg */
/* Addition zweier int-Zahlen */
i=1;
ii=-2;
printf("int: i=%d, ii=%d, i+ii=%d\n",i,ii,i+ii);
/* Ganzzahl-Division zweier short-int-Zahlen */
h=7;
hh=2;
printf("short: h=%hd, hh=%hd, h/hh=%hd\n",h,hh,h/hh);
/* Divisionsrest zweier long-int-Zahlen */
l=7l;
ll=2l;
/* Achtung beim Prozent: Zur Ausgabe doppelt schreiben */
printf("long: l=%ld, ll=%ld, l%%ll=%ld\n",l,ll,l%ll);
/* Ausgabe zweier Zeichen */
c='A';
cc='B';
printf("char: c=%c, cc=%c\n",c,cc);
/* Probieren Sie auch die Zeichen '\n', '\t', '\b' aus */
/* Multiplikation zweier float-Zahlen */
f=1.3E4f;
ff=-5.7E3f;
printf("float: f=%f, ff=%f, f*ff=%f\n",f,ff,f*ff);
/* Division zweier double-Zahlen (Gleitkomma-Division) */
d=1.3E4;
dd=-5.7E3;
printf("double: d=%lf, dd=%lf, d/dd=%lf\n",d,dd,d/dd);
/* Subtraktion zweier long-double-Zahlen */
q=1.3E4l;
qq=1.299999999E4l;
printf("long double: q=%Lf, qq=%Lf, q-qq=%Lf\n",q,qq,q-qq);
/* Ergebnis eines Vergleichs ist 0 oder 1 als int-Zahl */
c='A';
cc='B';
printf("Vergleich von %c und %c ergibt %d.\n",c,cc,c==cc);
/* Mehrere Zuweisungen in einem Ausdruck ausführen */
c=cc='X';
printf("Zwei Ixe: %c%c\n",c,cc);
/* Man kann Gleitkommazahlen in verschiedenen Formaten
ausgeben. Die 20 hinter dem % füllt links mit Leerzeichen
auf 20 Zeichen auf. */
dd=4E0/3.0;
printf("Gleit- > %20lf %20le %20lg\n",dd,dd,dd);
dd=4E9/3.0;
printf("komma- > %20lf %20le %20lg\n",dd,dd,dd);
dd=4E20/3.0;
printf("formate> %20lf %20le %20lg\n",dd,dd,dd);
/* Funktion main() und damit Programm beenden */
return(0);
}
|
|
|