Atari Logo
Atari Computer

Hauptseite -
Welches System? -
Hardware -
Software -
Emulatoren -
Internet
MausNet
Programmieren
Verweise
Über

C

Home Kontrollstrukturen Kontrollstrukturen switch

9.1 if

Die if Anweisung dient dazu, in Abhängigkeit von einer Bedingung Anweisungen auszuführen. Zusätzlich können mit einer else Anweisungen Anweisungen für den Nicht-if-Fall ausgeführt werden. Die Bedingung wird in Klammern hinter dem if aufgeführt und ist ein Ausdruck, der 0 oder ungleich 0 ist. Ist der Ausdruck ungleich 0, wird die dahinter stehende Anweisung bzw. der dainter stehende Block ausgeführt. Wir erinnern uns, in C gibt es keinen logischen Datentyp.

Und damit das etwas anschaulicher wird, hier einige Beispiele:

...
if (i!=0) printf("i ist nicht 0");

if (i)
   printf("i ist nicht 0");

if (i==0)
   printf("i ist 0");

if (!i)
   printf("i ist 0");

if (i==0)
   printf("i ist 0");
else
   printf("i ist nicht 0");

if (i!=0)
{
   printf("i ist nicht 0");
   i=0;
}

if (i=3)
   printf("i ist nicht 0");

Was machen jetzt die einzelnen Beispiele?

Das erste Beispiel prüft, ob i ungleich 0 ist und gibt dann einen Text aus.

Das zweite Beispiel macht genau das gleiche wie das erste. Allerdings wird hier ausgenutzt, daß ein Wert ungleich 0 schon einem true entspricht. Wenn die Variable aber nicht schon für logische Werte benutzt wird, sollte der Vergleich wie im ersten Beispiel geschrieben werden. Dies erleichtert es, das Programm zu verstehen. Die Anweisung wurde in die nächste Zeile geschrieben und eingerückt. Auch wenn häufig in anderen Programmen die Anweisung in die gleiche Zeile geschrieben wird, wie im Beispiel 1, sollte dem Einrücken der Vorzug gegeben werden. Damit ist die Anweisung leichter erkennbar. Dies gilt erst recht, wenn es sich um eine leere Anweisung mit lediglich einem Semikolon handelt.

Das dritte Beispiel prüft auf Gleichheit mit 0.

Und das vierte Beispiel zeigt eine kürzere Form. Ein Wert von 0 entspricht einem false und das negiert einem true.

Das fünfte Beispiel zeigt die Anwendung von else. Wenn die i den Wert 0 hat, die Bedingung also zutrifft, wird die erste Ausgabe gemacht. Im anderen Fall die zweite Ausgabe nach dem Schlüsselwort else. Ist im else-Fall wieder eine if-Abfrage nötig, werden üblicherweise die Blöcke nicht weiter eingerückt sondern das if direkt hinter das else geschrieben. Dies soll die Übersichtlichkeit solcher Abfragen erhöhen.

...
/* if mit Einrückung */
if (i==3)
   printf("i ist 3");
else
{
   if (i==4)
      printf("i ist 4");
   else
      if (i==5)
         printf("i ist 5");
}

/* Die übersichtliche Einrückung */
if (i==3)
   printf("i ist 3");
else if (i==4)
   printf("i ist 4");
else if (i==5)
   printf("i ist 5");

Das sechste Beispiel hat keine Anweisung für den if Fall sondern einen Block.

Das siebte Beispiel enthält eine Zuweisung als Ausdruck. Das Ergebnis der Zuweisung ist auch das Ergebnis des Ausdrucks und kann deshalb auch als Bedingung benutzt werden. Solchen Abkürzungen sollten aber vermieden werden, da die Zuweisung so etwas versteckt ist und damit das Programm schwerer zu verstehen ist. Deshalb geben viele Compiler an dieser Stelle eine Warnung aus. Achtung! Wird versehentlich bei einem Vergleich auf Gleichheit ein Gleichzeichen vergessen, kann der Ausdruck stattdessen eine Zuweisung ergeben. Und damit einen schwer zu findenden Fehler.

Da das else bei geschachtelten if-Anweisungen zu dem letzten if gehört, muß hier unter Umständen mit geschweiften Klammern gearbeitet werden! auch dazu ein Beispiel, hier soll das else zu dem ersten if gehören:

...
/* Falsch */
if (i==3)
   if (j==5)
      x=3;
else
   x=1;

/* Das entspricht */
if (i==3)
{
   if (j==5)
      x=3;
   else
      x= 1;
}

/* Gewollt */
if (i==3)
{
   if (j==5)
      x=3;
}
else
   x=1;

Die if Anweisung bauen wir auch sofort in unser Cookie Programm ein, denn wir müssen ja prüfen, ob die Systemvariable überhaupt einen Zeiger auf den Cookie Jar enthält.

#ifdef __TURBOC__
#include <tos.h>
#else
#ifdef __GNUC__
#include <osbind.h>
#else
#include <tosbind.h>
#endif
#endif
#include <stdio.h>

typedef struct cookie_entry {
   union {
      unsigned long name_long;
      char name_array[4];
   } name;
   unsigned long value;
} CookieEntry;

int main(void)
{  CookieEntry **CookieJarPtr, *CookieJar;
   long OldStack;

   OldStack=Super(0L);
   CookieJarPtr = (CookieEntry**)0x5a0L;
   CookieJar=*CookieJarPtr;
   Super((void *)OldStack);
   if (CookieJar == (CookieEntry *)0)
      printf("Dieses System hat keinen Cookie Jar\n");
   else
   {
      /* Hier können wir jetzt die Cookies ausgeben */
   }
   return 0;
}

Home Kontrollstrukturen Kontrollstrukturen switch


Best viewed with any browser English version not yet available.

Änderungen und Irrtümer vorbehalten. Letzte Änderung:
14 September 2001.
Home - Mail an den Webmaster - Impressum