Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
C von A bis Z von Jürgen Wolf
Das umfassende Handbuch für Linux, Unix und Windows
– 2., aktualisierte und erweiterte Auflage 2006
Buch: C von A bis Z

C von A bis Z
1.116 S., mit CD, Referenzkarte, 39,90 Euro
Galileo Computing
ISBN 3-89842-643-2
gp Kapitel 10 Kontrollstrukturen
  gp 10.1 Verzweigungen mit der if-Bedingung
    gp 10.1.1 Anweisungsblock
  gp 10.2 Die Verzweigung mit else if
  gp 10.3 Die Verzweigung mit else
  gp 10.4 Der !-Operator (logischer Operator)
  gp 10.5 Logisches UND (&&) – Logisches ODER (||)
  gp 10.6 Bedingungsoperator ?:
  gp 10.7 Fallunterscheidung: die switch-Verzweigung
    gp 10.7.1 default
  gp 10.8 Die while-Schleife
    gp 10.8.1 Endlosschleife (while)
    gp 10.8.2 Fehlervermeidung bei while-Schleifen
  gp 10.9 Die do while-Schleife
  gp 10.10 Die for-Schleife
    gp 10.10.1 Beispiele für eine for-Schleife
  gp 10.11 Kontrollierte Sprünge
    gp 10.11.1 continue
    gp 10.11.2 break
  gp 10.12 Direkte Sprünge mit goto
  gp 10.13 Notationsstil
    gp 10.13.1 K&R-Stil
    gp 10.13.2 Whitesmith-Stil
    gp 10.13.3 Allman-Stil
    gp 10.13.4 GNU EMACS-Stil
    gp 10.13.5 Der Stil des Autors ;) (K&R-like)

Kapitel 10 Kontrollstrukturen

Mit dem bisherigen Wissen können Sie die Programme immer nur sequenziell ablaufen lassen, sie laufen also immer Zeile für Zeile ab. In diesem Kapitel wird nun der sequenzielle Programmfluss gebrochen.

Folgende drei Möglichkeiten haben Sie, um den sequenziellen Programmfluss zu ändern:

gp  Verzweigungen: Im Programm wird eine Bedingung definiert, die entscheidet, an welcher Stelle das Programm fortgesetzt werden soll.
gp  Schleifen (Iteration): Ein Anweisungsblock wird sooft wiederholt, bis eine bestimmte Abbruchbedingung erfüllt wird.
gp  Sprünge: Die Programmausführung wird mit Hilfe von Sprungmarken an einer anderen Position fortgesetzt. Obwohl nach wie vor möglich, werden Sprünge in einem Programm mittlerweile als schlechter Stil angesehen und sind auch nicht notwendig. Es wird dabei von direkten Sprüngen gesprochen. Mit Schlüsselworten wie return, break, continue, exit und der Funktion abort() können jedoch kontrollierte Sprünge ausgeführt werden.

Galileo Computing - Zum Seitenanfang

10.1 Verzweigungen mit der if-Bedingung  downtop

Die if-Bedingung hat folgende Syntax:

if(BEDINGUNG == wahr) {
   Anweisung1;
 }
Anweisung2;

Wenn die Bedingung zwischen den Klammern des if-Schlüsselwortes wahr (true) ist, wird Anweisung1 im Anweisungsblock ausgeführt. Anschließend wird das Programm bei Anweisung2, also nach dem Anweisungsblock, fortgesetzt. Ist die Bedingung unwahr (false), wird Anweisung1 nicht ausgeführt, und das Programm fährt sofort mit Anweisung2 fort.


Galileo Computing - Zum Seitenanfang

10.1.1 Anweisungsblock  toptop

In einem Anweisungsblock werden Anweisungen (mindestens eine) zusammengefasst. Als Anweisungsblock gelten alle Anweisungen, die zwischen geschweiften Klammern ({}) stehen. Anweisungsblöcke lassen sich auch ineinander verschachteln. Es empfiehlt sich daher, auf eine saubere Strukturierung (d.h. entsprechendes Einrücken bei den Anweisungen eines Blocks) beim Erstellen eines Programms zu achten, um den Überblick zu bewahren.

Den Programmablauf der if-Bedingung können Sie sich schematisch folgendermaßen vorstellen (die Darstellung wird auch als Programmablaufplan bezeichnet):

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 10.1   Programmablaufplan zur if-Anweisung

Sehen Sie sich dazu das folgende Programmbeispiel an:

/* if1.c */
#include <stdio.h>
int main(void) {
   unsigned int alter;
   printf("Wie alt sind Sie: ");
   scanf("%d", &alter);
   /* ... noch jünger als 18? */
   if(alter < 18) {
      printf("Sie sind noch nicht volljährig\n");
   }
    printf("Bye\n");
    return 0;
}

Das Programm fordert Sie auf, Ihr Alter einzugeben. In der Bedingung if(zahl < 18) wird überprüft, ob Sie jünger als 18 Jahre alt sind. Sind Sie jünger, wird die printf()-Anweisung im Anweisungsblock mit entsprechender Ausgabe bearbeitet. Wurde aber ein Wert eingegeben, der größer oder gleich 18 ist, wird nur die printf()-Anweisung hinter dem Anweisungsblock ausgeführt, die »Bye« ausgibt. Dieses Beispiel als Programmablaufplan:

Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 10.2   Programmablaufplan zum Listing

Jetzt soll das Programm um einige if-Bedingungen erweitert werden:

/* if2.c */
#include <stdio.h>
int main(void) {
   unsigned int alter;
   printf("Wie alt sind Sie: ");
   scanf("%d", &alter);
   if(alter < 18)  {
      printf("Sie sind noch nicht volljährig\n");
   }
   if(alter > 18)  {
      printf("Sie sind volljährig\n");
   }
   if(alter == 18) {
      printf("Den Führerschein schon bestanden?\n");
   }
   printf("Bye\n");
   return 0;
}

Es ist offensichtlich, wie das Programm vorgeht: Sie geben das Alter ein und mithilfe der einzelnen if-Bedingungen testet es, ob die eingegebene Zahl größer, kleiner oder gleich 18 ist. Bevor das Programm etwas genauer analysiert wird, sollten Sie sich eine Tabelle mit den bisher verwendeten Vergleichsoperatoren und ihrer jeweiligen Bedeutung ansehen.


Tabelle 10.1   Übersicht zu Vergleichsoperatoren (Relationale Operatoren)

Vergleichsoperator Bedeutung
a < b Wahr, wenn a kleiner als b
a <= b Wahr, wenn a kleiner oder gleich b
a > b Wahr, wenn a größer als b
a >= b Wahr, wenn a größer oder gleich b
a == b Wahr, wenn a gleich b
a != b Wahr, wenn a ungleich b

Zurück zum Programm. Die erste Anweisung

if(alter < 18)

testet, ob die Zahl, die Sie eingegeben haben, kleiner als 18 ist. Ist die Bedingung wahr, springt das Programm unmittelbar in den für diese Bedingung geschriebenen Anweisungsblock, der in den geschweiften Klammern steht. Falls also die eingegebene Zahl kleiner als 18 ist, wird der Anweisungsblock

      {
         printf("Sie sind noch nicht volljährig\n");
      }

ausgeführt. Besteht der Anweisungsblock hinter der Kontrollstruktur lediglich aus einer einzigen Anweisung, so können die geschweiften Klammern auch weggelassen werden:

if(alter < 18)
   printf("Sie sind noch nicht volljährig\n");

Diese Schreibweise ist korrekt und wird auch häufig verwendet. Sie sollten sich jedoch klar machen, dass sie sehr leicht zur Fehlerquelle werden kann. Nämlich dann, wenn Sie eine weitere Anweisung hinzufügen wollen, die auch nur in dem Fall ausgeführt werden soll, wenn die if-Bedingung wahr ist, wie etwa im folgenden Beispiel:

if(alter < 18)
   printf("Sie sind noch nicht volljährig\n");
   printf("Sollte nur erscheinen, wenn (alter < 18)!\n");

Wenn – wie hier – dann die geschweiften Klammern vergessen werden, wird die zweite printf()-Anweisung immer ausgeführt, da die if-Bedingung im Wahr-Fall wirklich nur eine weitere Anweisung ausführt.

Korrekt müsste es folgendermaßen aussehen:

if(alter < 18) {
   printf("Sie sind noch nicht volljährig\n");
   printf("Sollte nur erscheinen, wenn (alter < 18)!\n");
}

Jetzt wird auch die zweite Anweisung nur ausgeführt, wenn die if-Bedingung wahr ist.

Die nächsten beiden if-Bedingungen verhalten sich analog. Hiermit wird getestet, ob die eingegebene Zahl für das Alter kleiner bzw. gleich 18 ist. Sollte sich einer dieser Fälle als wahr herausstellen, so wird ebenfalls der jeweils zugehörige Anweisungsblock ausgeführt.


Achtung   Ein häufig gemachter Fehler ist if(alter=18). Hier wurde der Variablen alter der Wert 18 zugewiesen, und der Anweisungsblock wird ausgeführt. Dabei ist es jedoch egal, ob der Wert gleich 18 ist, denn alter wird jetzt der Wert 18 zugewiesen. Diese if-Abfrage ist also immer wahr. Der Fehler ist zudem schwer auffindbar, da die Syntax absolut korrekt ist, der Compiler also keine Fehlermeldung anzeigt. Oft verwendete und empfohlene Maßnahme ist es, die Überprüfung umzustellen: if (18 == alter) ist syntaktisch korrekt und bewirkt das Gleiche. Hiermit würde der Compiler sofort eine Fehlermeldung anzeigen, falls Sie versehentlich if (18 = alter) schreiben, da sich einer Zahl keine Variable zuordnen lässt. Diese Umstellungsmethode funktioniert nur bei ==-Vergleichen, nicht bei den anderen Operatoren.


 << zurück
  
  Zum Katalog
Zum Katalog: C von A bis Z
C von A bis Z
bestellen
 Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen?
Ihre Meinung

 Buchtipps
Zum Katalog: Shell-Programmierung






 Shell-Programmierung


Zum Katalog: Linux-UNIX-Programmierung






 Linux-UNIX-Programmierung


Zum Katalog: C/C++






 C/C++


Zum Katalog: UML 2.0






 UML 2.0


Zum Katalog: Reguläre Ausdrücke






 Reguläre Ausdrücke


Zum Katalog: Linux






 Linux


 Shopping
Versandkostenfrei bestellen in Deutschland und Österreich
InfoInfo





Copyright © Galileo Press 2006
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de