Was ist C-Syntax?

Anfang der 1970er Jahre wurde am Massachusetts Institute of Technology (MIT) eine Sprache zum Schreiben eines Betriebssystems für eine DEC PDP-8 entwickelt. Sie sollte einfach zu übersetzen sein und die manuelle Optimierung des erzeugten Codes erlauben. Die Autoren waren Brian Kernighan und Dennis Ritchie. Die Sprache wird immer wieder bespöttelt als "Kryptographie" und "Edel-Assembler". Da das Betriebssystem Unix aber fast vollständig in ihr geschrieben ist, hat sich ihre Syntax weit verbreitet.

Es gibt eine große Anzahl von Sprachen, die auf der Syntax der Sprache C basieren. Ein paar Beispiele sind C, C++, C#, Java, JavaScript, Csh, AWK, TCL, PHP und Perl. Darum ist es gut, die Syntax von C zu kennen. Den allen diesen Sprachen gemeinsamen Kern möchte ich hier beschreiben.

Nicht zum Kern der Sprache gehört, wie Variablen vereinbart werden und welche Typen von Variablen es gibt. Einige Sprachen kennzeichnen Variablen auch grundsätzlich durch besondere Zeichen (z.B. mit einem $ in PHP);

Zum Sprachkern zählen auch die vielgeschmähten Pointer nicht. In vielen Sprachen werden sie durch Referenzen ersetzt oder entfallen ersatzlos.

Die Art der Funktionsvereinbarung ist auch unterschiedlich.

Auch objektorientierte Sprachelemente sind so unterschiedlich definiert, dass ich sie hier nicht berücksichtige.

Auch nicht zur Sprache gehören die verfügbaren Funktionen.

Kommentare

Es gibt zwei Arten von Kommentaren. Die erste Art leitet einen Kommentar ein, der nur bis zum Ende der aktuellen Zeile geht.

// Dieser Kommentar endet am Ende der Zeile

Die zweite Art von Kommentar kann über mehrere Zeilen gehen.

/* Dieser Kommentar
geht über beliebig
viele Zeilen */

Die zweite Art von Kommentar sollte man auf keinen Fall Schachteln, denn die meisten Sprachen vertragen das nicht. Also so nicht:

/* Bitte Kommentare /* nicht schachteln */ ! */

Variablen und Typen

In einigen Dialekten der C-Sprachen gibt es keine Variablentypen. Trotzdem möchte ich hier das Verfahren erklären, wie es sich bei C selbst darstellt.

Die wichtigsten Datentypen in C sind:

boolein Wahrheitswert, entweder true oder false
charein Zeichen. z.B. 'a'
intein ganzzahliger Wert, z.B. -23167
shortein kleiner ganzzahliger Wert
longein großer ganzzahliger Wert
unsignedein positiver ganzzahliger Wert. Dies kann auch mit char, int, short und long kombiniert werden.
floateine Fließpunktzahl, z.B. 1.25 oder 3e01
doubleeine große und genaue Fließpunktzahl

Variablen werden durch einen Typ, gefolgt von einer Liste von Variablennamen definiert.

int i, j;
float x, y, z;

Arrays (Felder) von Variablen werden durch eine nachgestellte Elementanzahl in eckigen Klammern definiert. Auch mehrdimensionale Felder gibt es - sie werden durch mehrere Anzahlen definiert.

int feld[10];
float array[30][2];

Auf Felder wird durch Indizierung in eckigen Klammern zugegriffen. Der Index reicht dabei von 0 bis zur angegebene Größe minus 1. Also bei "feld" von feld[0] bis feld[9]. Hier einige Beispiele:

j = feld[3];
array[j][0] = array[j][1];

Strings gibt es nicht als eigenen Datentyp in C. Sie werden als Arrays von Zeichen vereinbart. Der String ist logisch durch ein Null-Zeichen abgeschlossen. Stringkonstanten werden durch doppelte Anführungsstriche eingeschlossen (einzelne Zeichen nur durch einfache).

char str[20]; // Dies kann einen 19-Stelligen String plus dem Null-Zeichen aufnehmen
strcpy(str, "Aber Hallo!");

Man kann auch Strukturen vereinbaren, die aus mehreren Feldern unterschiedlichen Typs bestehen.

struct {
    int anzahl;
    char titel[50];
    float preis;
} Buch;

Auf die einzelnen Elemente kann man durch die Punkt-Syntax zugreifen.

Buch meinBuch; // vereinbart die Variable meinBuch vom struct-Typ Buch
meinBuch.anzahl = 3;
strcpy ( meinBuch.titel, "Die C-Programmiersprache" );
meinBuch.preis = 42.95;

Anweisungen

Eine Anweisung darf über mehrere Zeilen gehen und auf einer Zeile dürfen mehrere Anweisungen nebeneinander stehen, was man aus Gründen der Übersichtlichkeit normalerweise vermeiden sollte. Anweisungen werden durch Semikolon abgeschlossen.

e = 2.71828; pi = 3.141;
quatsch =
    e * pi;

Mehrere Anweisungen können auch mit Hilfe von geschweiften Klammern zu einer einzigen Anweisung zusammengefasst werden. Wo nur eine einzelne Anweisung stehen darf, kann so ein Anweisungsblock geschrieben werden.

{
    a = 3;
    b = 4;
    c = sqrt(a*a+b*b);
}

Ausdrücke

Ausdrücke bestehen aus Variablen, Funktionsaufrufen und Operatoren. Auch die Zuweisung wird in den meisten Sprachen zu den Operatoren gezählt.

Die Vorrangregeln für die wichtigsten Operatoren sind in folgender Tabelle dargestellt.

++ - -Inkrement (erhöhen um 1), Dekrement (abziehen von 1)
-Unäres Minus
* /Multiplikation und Division
+ -Addition und Subtraktion
<  <=  = =  !=  >=  >Logische Vergleiche: kleiner, kleiner oder gleich, gleich, ungleich, größer oder gleich, größer
!Logische Negation
&&logische Und-Verknüpfung
||logische Oder-Verknüpfung

Eine besondere Schreibweise ist die Verbindung von Zuweisung und operator. Damit kann man sich einiges an Schreibarbeit sparen. Die folgenden beiden Anweisungen sagen darum das Gleiche.

i = i + 5;
i += 5;

Kontrollstrukturen

Logische Bedingungen werden durch das if-Konstrukt ausgedrückt. Sie hat die Form:

if(Bedingung)
    Anweisung1;
else
    Anweisung2;

Sollen mehrere Fällle unterschieden werden, die durch einzelne Zahlenwerte ausgedrückt werden (z.B. Aufzählungswerte), kann man dies durch die switch-Anweisung bewerkstelligen. Jeder Fall muss durch eine break-Anweisung abgeschlossen werden. Sollen für mehrere Werte die gleiche Anweisung ausgeführt werden, dann kann man mehrere case-Anweisungen hintereinander schreiben. Ein besonderer Fall ist default - er wird durchgeführt, wenn keiner der anderen Fälle eingetreten ist.

switch(numerischerWert) {
  case 1:
    Anweisung1;
    break;
  case 2:
  case 3:
    Anweisung2;
    break;
  default:
    AnweisungD;
    break;
}

Soll eine Anweisung solange durchgeführt werden, wie eine Bedingung gilt, nimmt man die while-Anweisung.

while(Bedingung)
    Anweisung

Manchmal ist es angebracht, die Anweisung mindestens einmal durchzuführen und erst dann die Bedingung der Schleife abzufragen. Auch dafür gibt es eine Anweisung:

do
     Anweisung;
until Bedingung;

Für Anweisungen, die eine bestimmte Anzahl von Malen durchlaufen werden sollen, gibt es die for-Anweisung. Sie ist sehr vielseitig einsetzbar, weil sie sehr allgemein definiert ist. Die For-Anweisung enthält ihrerseits drei Anweisungen.

for( Ausdruck1; Bedingung; Ausdruck2 )
    Anweisung;

Die erste Anweisung wird am Anfang einmal ausgeführt. Hier kann man ein oder auch mehrere Variablen initialisieren. Dann wird die Bedingung geprüft - im Extremfall also die Schleife garnicht durchlaufen. Dann wird die Anweisung in der Schleife durchgeführt, und dann Ausdruck2 zum Hochzählen verwendet und wieder die Bedingung geprüft, Anweisung ausgeführt, hochgezählt und so weiter.

Als ein konkretes Beispiel werde ich hier die Zahlen von 1 bis 10 addieren:

int i, summe;
for( i = 1, summe=0; i <= 10; i++ )
    summe += i;

So, damit soll mein Überblick enden. Damit sollte der Einstieg in eine der vielen Dialekte der Sprache C möglich sein.

© Mario Boller-Olfert 2002 - E-Mail:Kontaktformular - 123-Byte - Homepage