Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

if-Statements in C/C++, PHP und JavaScript

Fallunterscheidungen zur Programmsteuerung I

Übersicht / Seite:

  1. if-Statements (mit Beispielen in C, C++, PHP und JavaScript)
  2. Switch-Case (Fallunterscheidungen mit Beispielen in C und JavaScript)

if-Anweisungen

Fallunterscheidungen und hier insbesondere if-Anweisungen, gehören in vielen Script- und Programmiersprachen zu den wichtigsten Kontrollstrukturen, mit denen ein Programmierer den Ablauf eines Scripts oder eines Programms steuern kann. Da sich der Einsatz von if-Statements bzw. von if-Anweisungen in den Sprachen C, C++, PHP und JavaScript kaum unterscheidet, möchten wir auf dieser Seite eine zusammenfassende Übersicht geben und haben die Beispiele so gewählt, so dass diese mit kleineren Änderungen in jeder der innerhalb dieses Webprojektes vorgestellten Script- und Programmiersprachen lauffähig wären.

Die einfachste Form eines if-Statements besteht aus einer Bedingung und einer Anweisung, die nur dann ausgeführt werden soll, wenn die Bedingung erfüllt wird. Von der Syntax her betrachtet kommt diese Kontrollstruktur noch ohne weitere Klammern und ohne einen Else-Zweig aus. Wobei ein Else-Zweig ohnehin nur als zusätzliche Verzweigung dienlich ist und insofern kein programmtechnischer Bedarf besteht entfallen kann.

if (Bedingung) 
    Anweisung;
else
    alternative Anweisung;

Bei der Auswertung der Bedingung unterscheiden sich die Sprachen geringfügig. So wird in C geprüft, ob die Bedingung als Ergebnis einen von 0 verschiedenen Wert ergibt, der dann wie der boolesche Wert true für wahr gewertet würde oder falls das Ergebnis 0 sein sollte, als false für unwahr.
In PHP kann hingegen die Zahl 0 das erwartete Ergebnis darstellen, wobei dieses Ergebnis von einem if-Statement zwar ebenfalls bei einem einfachen Vergleich mit dem == Operator als false gewertet werden würde, doch mit Hilfe des === Operators kann zusätzlich ein Typvergleich durchgeführt und geprüft werden, ob es sich um die Ziffer 0 handelt oder um den booleschen Wert false. Ähnlich verhält es sich in JavaScript

if (Bedingung !== false) 
    Führe Anweisung aus, falls die 
    Bedingung kein false als Ergebnis liefert;

Sowie mehr als nur eine Anweisung ausgeführt werden soll, falls eine Bedingung erfüllt wird, müssen die einzelnen Anweisungen zu einem Anweisungsblock mit geschweiften Klammern zusammengefasst werden. Es spricht jedoch nichts dagegen, Anweisungen grundsätzlich in geschweifte Klammern zusetzen, was vor allem bei mehrere ineinander verschachtelten Fallunterscheidungen die Übersichtlichkeit verbessert, insofern die einzelnen if-Statements mit ihren Anweisungen entsprechend eingerückt werden.

if (Bedingung) {
    Anweisung 1;
    Anweisung 2;
} 
else {
    alternative Anweisung;
}

if-Statements können zusätzlich zu einem Else-Zweig durch Einfügung einer beliebigen Anzahl von else if-Zweigen erweitert werden. Falls die erste Bedingung nicht zutraf, werden die vorhandenen else if-Bedingungen in der Reihenfolge abgearbeitet, wie diese notiert wurden. Trifft eine else if-Bedingung zu, werden die nachfolgenden else if-Bedingungen nicht mehr geprüft. Trifft weder die erste Bedingung zu, noch eine else if-Bedingung, wird die zum letzten Else-Zweig gehörende Anweisung ausgeführt.
In PHP ist es üblich, statt die Schlüsselwörter else und if hintereinander zu notieren, dass Schlüsselwort elseif zu verwenden. Werden keine geschweiften Klammern benutzt, ist es sogar erforderlich die letzte Variante zu wählen, um Fehlermitteilungen zu vermeiden.

if (wert1 == wert2) {
    Anweisung 1;
    Anweisung 2;
}
else if (wert1 > wert2) {
    alternative Anweisung 1;
} 
else if (wert1 < wert2) {
    alternative Anweisung 2;
}
else {
    alternative Anweisung 3;
}

Praktische Beispiele

Das erste Beispiel kommt noch ohne in geschweifte Klammern gefasste An­weisungs­blöcke aus.

Ein Beispiel in C:

#include <stdio.h>   // für printf und scanf
#include <conio.h>   // für getch

int main() {

    int eingabe;
    int fuenfhundet = 500;

    printf("Eingabe: ");
    scanf("%d", &eingabe);
    printf("\r\n");

    if (eingabe >= fuenfhundet)
        printf("%d ist gleich oder gr\x94\xe1 \ber als %d\n", eingabe, fuenfhundet);
    else
        printf("%d ist nicht gleich oder gr\x94\xe1 \ber als %d\n", eingabe, fuenfhundet);

    getch();
    return 0;
}

Beim zweiten Beispiel würde es bereits nicht mehr ohne in geschweifte Klammern gefasste Anweisungsblöcke abgehen. Weiterhin würde ohne entsprechende Einrückungen und Kommentare sehr schnell der Überblick verloren gehen. Nur könnten die Kommentare etwas sparsamer eingesetzt werden.

Beispiel mit Verschachtelungen in C++:

#include <iostream>
using namespace std;

int  main() {

    int  eingabe;
    int  dreihundert  = 300;
    int  vierhundert  = 400;
    int  fuenfhundert = 500;

    cout << "Eingabe: ";
    cin  >> eingabe;                // Die Eingabe
    cout << endl << endl;           // Eine Leerzeile
    cout << eingabe;                // Ausgabe von Eingabe

    // Ist Eingabe gleich oder größer 300 und kleiner 500?
    if (eingabe < fuenfhundert && eingabe >= dreihundert) {
        /*
         Ausgabe der ersten Hälfte eines Teilsatzes, 
         die zweite Hälfte des Satzes ergibt sich erst 
         durch eine weitere Fallunterscheidung.
        */
        cout << " ist kleiner als " << fuenfhundert;
        /*
         Falls die Bedingungen erfüllt wurden, die nächste Frage:
         Ist Eingabe größer als 400?
        */
        if (eingabe > vierhundert) {
            cout << " und gr\x94\xe1 \ber als " << vierhundert << endl;
        }
        // Falls Eingabe kleiner 500 aber nicht größer als 400 ist
        else {
            cout << " aber nicht gr\x94\xe1 \ber als ";
            cout << vierhundert << endl;
        }
    }
    /*
     Falls Eingabe nicht kleiner als 500 ist:
     Erste Frage, ist Eingabe gleich 500?
     Zweite Frage, ist Eingabe größer 500?
    */
    else if (eingabe == fuenfhundert) {
        cout << " ist gleich ";
        cout << fuenfhundert << endl;
    }
    else if (eingabe > fuenfhundert) {
        cout << " ist gr\x94\xe1 \ber als ";
        cout << fuenfhundert << endl;
    }
    // Falls Eingabe kleiner als 300 ist
    else {
        cout << " ist kleiner als " << dreihundert;
        cout << " und " << fuenfhundert << endl;
    }
    // Hält Fenster bis zur Bestätigung mit Enter offen
    cin.ignore(1,'\n');
    cin.get();
    return 0;
}

Hinweis: Damit sich ein Konsolenfenster nicht in Bruchteilen einer Sekunde wieder schließt, sobald ein Programm abgearbeitet ist, wurde bei den bisherigen C++ Listings cin.get verwendet, um auf eine weitere Eingabe zu warten. Erfolgt jedoch bereits wie in den Beispielen vorher eine Eingabe, so enthält der Eingabepuffer nicht nur die eingegebene Zahl, sondern auch \n für Newline. Dieses muss vor cin.get mit cin.ignore entfernt werden, sonst würde cin.get dieses Zeichen als Eingabe werten und nicht wie erwartet das Konsolenfenster offen halten.
So wie hier notiert, wird jedoch nur \n entfernt und keine weiteren Zeichen.

Alternative Syntax

Die vorgestellten Script- und Programmiersprachen C, C++, PHP und JavaScript unterschützen eine alternative Syntax mit dem ternären Operator (auch Trinitäts-Operator genannt) bei Kontrollstrukturen, wobei es kaum Unterschiede zwischen den Sprachen gibt. Den Ausdruck für die Bedingung in runde Klammern zu setzen ist nicht unbedingt erforderlich, erhöht aber die Lesbarkeit.

Alternative Syntax in C:

#include <stdio.h>
#include <conio.h>

int main() {

    int eingabe;
    int ausgabe;

    printf("Eingabe: ");
    scanf("%d", &eingabe);
    printf("\r\n");

    ausgabe = (eingabe > 100) ? 100 : 0;

    printf("Ausgabe %d\n", ausgabe);
    /*
    Falls Eingabe größer als 100: Ausgabe 100
    Falls Eingabe kleiner als 100: Ausgabe 0
    */
    getch();
    return 0;
}

Eine Variante in C++:

#include <iostream>
using namespace std;

int main() {

    int abc = 0;
    int eingabe;

    cout << "Eingabe: ";
    cin  >> eingabe;
    cout << endl << endl;

    (eingabe != abc) ? cout << "True " << eingabe : cout << "False " << eingabe;

    cin.ignore(1,'\n');
    cin.get();
    return 0;
}

Alternative Syntax in JavaScript:

<script type="text/javascript">
"use strict";
var bedingung = "abc";

var abc = (bedingung == "abc") ? "Ist erfüllt" : "Ist nicht erfüllt";
alert(abc);

// Ausgabe mit alert: Ist erfüllt
</script>

Alternative Syntax mit PHP:

<?php
$bedingung = "abc";

$abc = ($bedingung == "abc") ? "Ist erfüllt" : "Ist nicht erfüllt";
echo $abc;

// Ausgabe: Ist erfüllt
?>

Bei einer zweiten Variante, die ohne einen ternären Operator auskommt und sich besonders für den Einsatz in HTML-Dokumenten eignet, wird die öffnende Klammer gegen einen Doppelpunkt vertauscht und am Ende des kompletten if-Statements das Schlüsselwort endif notiert.

Eine zweite, für die Verschachtelung von HTML mit PHP-Code geeignete Variante:

<?php $bedingung = "abc"; ?>
<p>HTML und PHP in einer Datei vermischen.</p>

<?php if ($bedingung == "abc"): ?>
    <b>Gebe HTML mit fetten Text aus.</b>

<?php elseif ($bedingung == "def"): ?>
    <u>Gebe HTML mit unterstrichenem Text aus.</u>

<?php else: ?>
    <em>Gebe HTML mit kursiv Text aus.</em>

<?php endif;

// Ausgabe: Gebe HTML mit fetten Text aus.
?>

weiterlesen: Fallunterscheidungen » Switch-Case

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen