5.3 Der Bedingungsoperator ?:
Der Bedingungsoperator ?: ist der einzige dreiwertige Operator in C. Er ist auch als bedingte Bewertung bekannt. Im Prinzip handelt es sich bei diesem Operator um eine Kurzform der if- mit einer alternativen else-Anweisung. Die Syntax des Operators sieht wie folgt aus:
Bedingung ? Ausdruck1 : Ausdruck2
Ist Bedingung wahr und gibt ungleich 0 zurück, wird Ausdruck1 ausgeführt. Ist Bedingung hingegen unwahr und gleich 0, wird Ausdruck2 ausgeführt. Der Programmablauf ist somit derselbe wie bei einer bedingten if-Anweisung mit einer alternativen else-Verzweigung.
Dieser Operator sollte auf keinen Fall die if-Anweisung mit der alternativen else-Verzweigung ersetzen. Diese ist nach wie vor häufig besser lesbar als eine bedingte Auswertung mit dem ternären Operator. Trotzdem gibt es in der Praxis einfache Beispiele, bei denen der Bedingungsoperator einer if-Bedingung mit else-Verzweigung vorzuziehen ist. Mit dem folgenden Beispiel etwa soll der maximale oder der minimale Wert ermittelt werden und einer konstanten Variablen zugewiesen werden:
00 // Kapitel5/minmax.c
01 #include <stdio.h>
02 int main(void) {
03 int val1 = 0, val2 = 0;
04 printf("Bitte zwei Ganzzahlwerte eingeben: ");
05 int check = scanf("%d %d", &val1, &val2);
06 if(check != 2) {
07 printf("Fehler bei der Eingabe ...\n");
08 return 1;
09 }
10 const int max = (val1 > val2) ?val1 :val2;
11 printf("Höherer Wert: %d\n", max);
12 return 0;
13 }
Das Hauptaugenmerk sollten Sie auf Zeile (10) legen. Hier wird der ternäre Operator verwendet. Die Auswertung des ternären Operators wird an die konstante Variable max übergeben. Es wird zunächst die Bedingung (val1 > val2) ausgewertet, also ob der eingegebene Ganzzahlwert von val1 größer als val2 ist. Trifft dies zu, wird die erste Anweisung hinter dem Fragezeichen ausgeführt. In dem letzten Beispiel wird nur der Wert der Variablen val1 als Ausdruck verwendet und somit an die Variable max übergeben. Ist die Bedingung (val1 > val2) hingegen falsch, wird der zweite Ausdruck hinter dem Doppelpunkt ausgeführt. Dadurch wird der Wert der Variablen val2 als Ausdruck verwendet und der konstanten Variablen max zugewiesen.
Theoretisch ist es natürlich auch möglich, die einzelnen Ausdrücke ineinander zu verschachteln. Der Lesbarkeit des Codes zuliebe können wir Ihnen aber von solchen wilden Verschachtelungen nur abraten. Ein abschreckendes Beispiel, das oft im Internet auftaucht, wäre Folgendes:
big = (a>b) ?((a>c) ?a :c) :((b>c) ?b :c);
Diese Zeile macht nichts anderes, als den größten Wert der drei Variablen a, b und c zu ermitteln und an die Variable big zu übergeben.