Handbuch zur dynamischen Ablaufverfolgung in Solaris

Bedingte Ausdrücke

D unterstützt zwar keine if-then-else-Konstrukte, bietet aber Unterstützung für einfache bedingte Ausdrücke unter Verwendung der Operatoren ? und : . Diese Operatoren ermöglichen die Zuweisung von Dreiergruppen von Anweisungen, in denen der erste Ausdruck zur bedingten Auswertung eines der anderen beiden dient. Beispielsweise könnte die folgende D-Anweisung verwendet werden, um eine Variable x je nach dem Wert von i auf eine von zwei Zeichenketten zu setzen:

x = i == 0 ? "zero" : "non-zero";

In diesem Beispiel wird zunächst der Ausdruck i == 0 ausgewertet, um festzustellen, ob er wahr oder falsch ist. Ist der erste Ausdruck wahr, wird der zweite Ausdruck ausgewertet und der Ausdruck ?: gibt seinen Wert zurück. Ist der erste Ausdruck falsch, wird der dritte Ausdruck ausgewertet und der Ausdruck ?: gibt seinen Wert zurück.

Wie bei allen D-Operatoren können Sie in einem Ausdruck mehrere ?:-Operatoren verwenden und so komplexere Ausdrücke generieren. So würde beispielsweise der folgende Ausdruck die eines der Zeichen 0-9, a-z oder A-Z enthaltende char-Variable c nehmen und den Wert dieses Zeichens zurückgeben, wenn es als Ziffer in einer hexadezimalen (Grundzahl 16) Zahl interpretiert wird:

hexval = (c >= '0' && c <= '9') ? c - '0' :
    (c >= 'a' && c <= 'z') ? c + 10 - 'a' : c + 10 - 'A';

Der erste mit ?: verwendete Ausdruck muss ein Zeiger auf eine Ganzzahl sein, damit er auf seinen Wahrheitswert hin untersucht werden kann. Beim zweiten und dritten Ausdruck kann es sich um einen beliebigen kompatiblen Typ handeln. Die Konstruktion eines bedingten Ausdrucks ist nicht möglich, wenn beispielsweise ein Pfad eine Zeichenkette und ein anderer Pfad eine Ganzzahl zurückgibt. Außerdem dürfen der zweite und der dritte Ausdruck keine Ablaufverfolgungsfunktion wie trace() oder printf() aufrufen. Zur bedingten Ablaufverfolgung von Daten greifen Sie, wie in Kapitel 1Einführung erläutert, stattdessen auf Prädikate zurück.