Der ternäre Operator in C
Es ist möglich, genau einen von zwei Ausdrücken, die hinter einem Fragezeichen »?« stehen und durch einen Doppelpunkt »:« getrennt sind, auszuwerten.
- Beispiel einer Anwendung des ternären Operators
1
?"wahr" : "falsch"
Die erste Auswertung
Zuerst wird der Ausdruck vor dem Fragezeichen (»1« in dem obigen Beispiel) ausgewertet.
Dieser kann „wahr“ (ungleich »0«) oder „falsch“ (gleich »0«) sein. – Wir bezeichnen hier zur Vereinfachung der Sprechweise alle Zahlen, außer Null, als „wahrartig “ (oder – kurz – als „wahr “) und die Zahl Null als „falschartig “ (oder – kurz – als „falsch “).
Der Fall „wahr“
Ergibt die Auswertung des Ausdrucks vor dem Fragezeichen nicht »0«, so wird der Ausdruck vor dem Doppelpunkt (»"wahr"«) ausgewertet.
- Auswertung des Ausdrucks vor dem Doppelpunkt
.---------- 1
| ?
|
'--> "wahr" : "falsch"
Der Wert des gesamten Ausdrucks wird dann der Wert des zuletzt ausgewerteten Ausdrucks, also des Ausdrucks vor dem Doppelpunkt.
main.c
#include <stdio.h>
int main( void )
{ printf( "%s\n",1
?"wahr" : "falsch"
); }
Protokoll
wahr
Der Fall „falsch“
Ergibt die Auswertung des Ausdrucks vor dem Fragezeichen »0«, so wird der Ausdruck hinter dem Doppelpunkt (»"falsch"«) ausgewertet.
- Auswertung des Ausdrucks hinter dem Doppelpunkt
0 ------------.
? |
|
"wahr" : "falsch" <--'
Der Wert des gesamten Ausdrucks wird dann der Wert des zuletzt ausgewerteten Ausdrucks, also des Ausdrucks hinter dem Doppelpunkt.
main.c
#include <stdio.h>
int main( void )
{ printf( "%s\n",0
?"wahr" : "falsch"
); }
Protokoll
falsch
Übungsfragen
? Übungsfrage 0
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ printf( "%d\n",0
?1 : 2
); }
? Übungsfrage 1
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ printf( "%d\n",-1
?2 : 3
); }
? Übungsfrage 2
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
int main( void )
{ printf( "%s\n",2
?"L" : "R"
); }
? Übungsfrage 3
Welche Ausgabe erzeugt das folgende Programm?
main.c
#include <stdio.h>
void f(){ printf( "f\n" ); }
void g(){ printf( "g\n" ); }int main( void )
{0
?f() : g()
; }
? Übungsfrage 4
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
main.c
#include <stdio.h>
int f(){ printf( "f\n" ); return 1; }
int main( void )
{f()
?4 : -6
; }
? Übungsfrage 5
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
main.c
#include <stdio.h>
int f(){ printf( "f\n" ); return 0; }
int main( void )
{f()
?4 : -6
; }
? Übungsfrage 6
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
main.c
#include <stdio.h>
int main( void )
{ int x = 2 - 3;int y =
x
?7 : 5
; printf( "%d\n", y ); }
? Übungsfrage 7
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
main.c
#include <stdio.h>
void f( int const x )
{ printf( "%s\n",( x - 4 )
?"q" : "p"
); }
int main( void )
{ f( 3 );
f( 4 );
f( 5 ); }
Übungsaufgaben
/ Übungsaufgabe 0
Schreiben Sie eine Funktion, welche die Zeichenfolge »n« ausgibt, wenn sie mit »0« aufgerufen wird, und die Zeichenfolge »s« sonst.
/ Übungsaufgabe 1
Schreiben Sie eine Funktion, welche die Zeichenfolge »n« ergibt, wenn sie mit »0« aufgerufen wird, und die Zeichenfolge »s« sonst.
/ Übungsaufgabe 2
Schreiben Sie eine Funktion, die mit fünfzigprozentiger Wahrscheinlichkeit die Zeichenfolge »Kopf« zurückgibt, und sonst »Zahl«.
/ Übungsaufgabe 3
Schreiben Sie eine Funktion, die eine Temperatur vom Typ »int« als Argument akzeptiert und die Zeichenfolge »ok« zurückgibt, wenn die Temperatur unter 25 liegt, und sonst »zu heiss!« (an Stelle des Doppel-S darf auch ein Eszett verwendet werden.). Es kann davon ausgegangen werden, daß die an die Funktion übergebene Temperatur zwischen 0 und 99 liegt.