Die Auswertung der weiteren Operanden des ternären Operators in C
Syntax
Hier geben wir das schon gezeigte Syntaxdiagramm erneut wieder.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.----------. .-. .----------. .-. .----------.
--->| Ausdruck |--->( ? )-->| Ausdruck |--->( : )-->| Ausdruck |--->
'----------' '-' '----------' '-' '----------'
Semantik
Bei der Auswertung eines Ausdrucks dieser Art wird zunächst der erste Operand ausgewertet.
- Falls der Datentyp des ersten Operanden »int« oder »double« ist und seine Auswertung »0« beziehungsweise »0.0« ergibt, wird der Ausdruck rechts vom Doppelpunkt »:« ausgewertet,
- sonst wird der Wert des Ausdrucks links vom Doppelpunkt »:« ausgewertet.
Es werden als stets nur zwei der drei in einem ?-Ausdruck enthaltenen Ausdrücke ausgewertet: Der vor dem Fragezeichen und einer der beiden hinter dem Fragezeichen.
- vereinfachte Darstellung der Entscheidung
Ausdruck ?
.
wenn | wenn
nicht 0 .--------'--------. 0
| |
' '
Ausdruck : Ausdruck
Falls der erste Operand ein Zeichenfolgenliteral ist, wird immer der zweite Operand ausgewertet.
Beispiel zum ternären Operator
Das folgende Beispiel zeigt, wie der Ausdruck links vom Doppelpunkt nur dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen nicht gleich »0« ist.
main.c
#include <stdio.h>
int main( void )
{ 0 ? puts( "alpha" ): 0;
1 ? puts( "gamma" ): 0; }stdout
gamma
Der Ausdruck wird also nur unter einer bestimmten Bedingung ausgewertet – er wird bedingt ausgewertet.
Wir können den ternären Operator also einsetzen, um einen Ausdruck nur unter einer bestimmten Bedingung auswerten zu lassen, er erlaubt uns also eine bedingte Auswertung.
Beispiel zum ternären Operator (1)
Das folgende Beispiel zeigt, wie der Ausdruck rechts vom Doppelpunkt nur dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen gleich »0« ist.
main.c
#include <stdio.h>
int main( void )
{ 0 ? 0 : puts( "alpha" );
1 ? 0 : puts( "gamma" ); }stdout
alpha
Beispiel zum ternären Operator (2)
Das folgende Beispiel zeigt, wie der Ausdruck links vom Doppelpunkt genau dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen nicht gleich »0« ist, und der Ausdruck links vom Doppelpunkt genau dann ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen gleich »0« ist.
main.c
#include <stdio.h>
int main( void )
{ 0 ? puts( "alpha" ): puts( "gamma" );
1 ? puts( "delta" ): puts( "theta" ); }stdout
gamma
delta
Zuweisungen als gesteuerte Ausdrücke
Das folgende Beispiel zeigt, die Wirkungen von Zuweisungsoperationen durch den ?-Ausdruck gesteuert werden können.
main.c
#include <stdio.h>
int main( void )
{ int x = -1;
int y = -1;0 ? x = 0 :( y = 0 );
1 ? x = 1 :( y = 1 );printf( "x = %d,\n", x );
printf( "y = %d.\n", y ); }stdout
x = 1,
y = 0.
Aufgrund einer etwas komplizierten Regelung kann man die Priorität des ?-Operators nicht auf einfache Weise angeben, sondern muß die genauen Regeln zur Interpretation von Ausdrücken der Spezifikation der Programmiersprache entnehmen. Diese genauen Regeln sollen an dieser Stelle dieses Kurses noch nicht behandelt werden. Die Priorität dieses Operators kann als schwächer als die der meisten Operatoren angesehen werden und ähnelt der des Zuweisungsoperators. Daher sind besonders die Kombinationen mit dem Zuweisungsoperator schwierig. Hier können dann im Zweifelsfall Klammern verwendet werden.
Der Ausdruck »0 ? x = 0 : y = 0« wird als »( 0 ? x = 0 : y )= 0« interpretiert, weswegen die oben verwendeten Klammern nötig sind.
Der oben verwendete Ausdruck »0 ? x = 0 :( y = 0 )« bedeutet »0 ?( x = 0 ):( y = 0 )«.
Übungsfragen
? Übungsfrage
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ 1 ? printf( "A\n" ): 0;
0 ? printf( "B\n" ): 0; }
? Übungsfrage
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ -7 ? printf( "A\n" ): 0;
+0 ? printf( "B\n" ): 0;
+3 ? printf( "C\n" ): 0; }
? Übungsfrage
Die Funktion »printf« gibt in der Regel die Anzahl der von diesem Aufruf ausgegebenen Zeichen zurück. Welche Ausgabe erzeugt demnach das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ printf( "A" )? printf( "B\n" ): 0;
printf( "" )? printf( "C\n" ): 0; }
Zeichenfolgenliterale als Steuerausdrücke *
Das folgende Beispiel zeigt, daß der Ausdruck links vom Doppelpunkt immer ausgewertet wird, wenn der Ausdruck vor dem Fragezeichen eine Zeichenfolge als Wert hat.
main.c
#include <stdio.h>
int main( void )
{ "" ? puts( "alpha" ): 0;
"a" ? puts( "gamma" ): 0;
"0" ? puts( "delta" ): 0; }stdout
alpha
gamma
delta
Zeichenfolgenliterale spielen an dieser Stelle allerdings in der Praxis keine Rolle.