[Inhalt][0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17]

Teil 9 : Vereinfachungen, oder das Salz in der C-Suppe

Wenn man ein Programm schreibt, fragt man sich unweigerlich, ob man bestimmte Anweisungen nicht einfacher darstellen kann. Nach dem zigsten " X = X+1 " möchte man es am liebsten nicht mehr sehen. Bei der Entwicklung von C war man sich dessen durchaus bewußt und versuchte dies auch einzubeziehen, da die Programmierer ja auch nicht unbedingt den Drang verspürten alles doppelt und dreifach zu schreiben.
 
Zuweisungen

Nehmen wir den einfachen Fall einer Variablenerhöhung um einen bestimmten Wert an.
 

A = A + 10

Vereinfacht wird das Ganze durch folgenden Ausdruck
 

A += 10

Diese Vereinfachungen arbeiten nach dem folgenden Schema
 

A (OPERATOR)= B steht für A = A (Operator) B

Um es etwas verständlicher darzustellen:
 

Vereinfachung steht für
A += B
A = A + B
A -= B
A = A - B
A *= B
A = A * B
A /= B
A = A / B

Das kann man mit allen Operatoren machen. Auch mit denen, die wir später noch kennenlernen werden.
 
 
bedingte Zuweisungen

Man kann bei kurzen if-else-Ausdrücken diese auch folgendermaßen abkürzen.
 

if ( Bedingung )  a = Wert1;
else a = Wert2;
a = (( Bedingung ) ? Wert1 : Wert2 );

Wie man sehen kann werden bei beiden Möglichkeiten einer Variablen, abhängig von der Bedingung, entweder wenn die Bedingung wahr ist, der eine (Wert1) oder, wenn sie falsch ist, der andere Ausdruck (Wert2) zugewiesen.
 
 
Postfix-Operatoren

Möchte man einen Variablen Wert nach einer Aktion, z.B. einem Schleifenablauf, um eins erhöhen, so erfolgt dies mit derAnweisung
 

A++

Steht der Ausdruck alleine da, wird A ums 1 erhöht, da ansonsten keine Zuweisung erfolgt. Es ist das Gleiche wie
 

A += 1

Steht der Ausdruck in einer Zuweisung,
 

A = B++

... so ist es das Gleiche, wie
 

A = B

B = B + 1

Wie man hier sehen kann, wird B erst nach der Zuweisung erhöht! In einer Schleife mit der Zählvariablen i sieht das dann folgendermaßen aus.
 

for ( i = 0 ; i < 5 ; i++ )

{

    (Schleifenkörper)
}

Um die Funktionsweise zu verdeutlichen, schauen wir uns an, wie die Schleife abgearbeitet wird. Als erstes wird i mit 0 initialisiert und der Schleifenkörper solange abgearbeitet, solange i < 5 gilt. Beim ersten Aufruf von i++ wird der Wert übergeben, den i hat und erst danach wird i um 1 erhöht! Beim zweiten Durchgang hat i den Wert 1 der i im ersten Durchgang nachträglich zugewiesen wurde. Nach dem selben System arbeitet auch
 

A--

wobei hier A um eins reduziert wird.
 

A = B--

steht also für
 

A = B

B = B - 1


 
 
 
Prefix -Operatoren

Hier werden die zugeordneten Variablen vor der Wertübergabe erhöht/reduziert.
 

A = ++B

steht folglich für
 

B = B+ 1

A= B

Analog dazu gibt es natürlich auch
 

A = --B

welches folgenden Effekt hat
 

B = B - 1

A = B


 
 
Typendefinition mit Typedef

Wenn wir bisher structs oder unions erzeugten, so hatten unsere neuen Datenstrukturen jeweils beim Erzeugen der Variablen des Type den ganzen Rattenschwanz der Deklaration davor. Durch den Deklarationsbefehl typedef wird einer Datenstruktur ein eigener Typenbezeichner zugewiesen.
 

typedef int Laenge;

Hier wird der Variablentyp Laenge synonym zu int benutzt. Damit kann man Strukturdefinitionen z.B. vereinfachen. Im foglenden Beispiel erzeugen wir die neue Typendefinition Feld.
 

struct test
{
int laenge;
double * feld;
};

typedef struct test Feld;

Nun können wir im folgenden Programm anschließend den so definierten neuen Typ benutzen.
 

Feld neu;

neu.laenge = 10;
neu.feld = malloc (neu.laenge * sizeof(double));

So könnte man z.B. einen Typen definieren, der aus einem struct test ein Feld beliebiger Größe erzeugt.
 
Übungsbeispiel

Als kleines Übungsbeispiel sollten sie versuchen das folgende Programm zu verstehen.
 

#include <stdio.h>

void main (void)
{

 int a=1;
 int b=2;

 printf ("\n a = %d \t b = %d \n",a,b);

 a += b++;
 printf ("\n a = %d \t b = %d \n",a,b);

 a += ++b;
 printf ("\n a = %d \t b = %d \n",a,b);

}

Versuchen sie zu nachzuvollziehen, warum die folgenden Ergebnisse geliefert werden.

Screenshot des ausgeführten Programms



[Inhalt][0][1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16][17]