Der ternäre Operator in Java
Ein Operator mit drei Operandenstellen ist ein ternärer Operator.
In Java gibt es genau einen ternären Operator, welcher deswegen auch der ternäre Operator genannt wird.
Der ternäre Operator besteht aus einem Fragezeichen »?« und einem Doppelpunkt »:«. Andere mögliche Bezeichnungen für diesen Operator sind daher: „?-Operator “ („Fragezeichen-Operator“) und „?:-Operator “ („Fragezeichen-Doppelpunkt-Operator“).
Die Auswertung des ternären Operators
Ein mit dem ternären Operator geschriebener ternärer Ausdruck besteht aus einem Fragezeichen »?« und einem Doppelpunkt »:«, dabei findet sich ein Ausdruck mit dem Typ »boolean« vor dem Fragezeichen »?« und jeweils ein Ausdruck vor und hinter dem Doppelpunkt »:«.
- Beispiel einer Anwendung des ternären Operators
true
?"wahr" : "falsch"
Zuerst wird der Ausdruck vor dem Fragezeichen (»true« in dem obigen Beispiel) ausgewertet.
Anschließend wird genau einer von den beiden Ausdrücken, die durch den Doppelpunkt »:« getrennt sind, ausgewertet.
Der Fall »true«
Ergibt die Auswertung des Ausdrucks vor dem Fragezeichen »true«, so wird der Ausdruck vor dem Doppelpunkt (»"wahr"«) ausgewertet.
- Auswertung des Ausdrucks vor dem Doppelpunkt
.--------- true
| ?
|
'--> "wahr" : "falsch"
Der Wert des gesamten Ausdrucks wird dann der Wert des zuletzt ausgewerteten Ausdrucks, also des Ausdrucks vor dem Doppelpunkt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(true
?"wahr" : "falsch"
); }}
Protokoll
wahr
Der Fall »false«
Ergibt die Auswertung des Ausdrucks vor dem Fragezeichen »false«, so wird der Ausdruck hinter dem Doppelpunkt (»"falsch"«) ausgewertet.
- Auswertung des Ausdrucks hinter dem Doppelpunkt
false ----------.
? |
|
"wahr" : "falsch" <--'
Der Wert des gesamten Ausdrucks wird dann der Wert des zuletzt ausgewerteten Ausdrucks, also des Ausdrucks hinter dem Doppelpunkt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(false
?"wahr" : "falsch"
); }}
Protokoll
falsch
Die Priorität des ternären Operators
Da der ternäre Operator drei Operandenstellen hat, erlaubt er mehr Möglichkeiten der Kombination als andere Operatoren. Es ist nicht ganz einfach, die Priorität dieses Operators auf die übliche Weise zu beschreiben, da diese sich an binären Operatoren einer bestimmten Art orientiert. Für den Anfang reicht es sich zu merken, daß die Priorität dieses Operators sehr schwach ist, so daß fast alle Operanden mit anderen Operator (außer dem Zuweisungsoperator) ohne Klammern verwendet werden können. Wenn ein ternärer Ausdruck auf der rechten Seite eines Zuweisungsoperators verwendet wird, ist seine Priorität jedoch so stark, daß er nicht eingeklammert werden muß, wie auch das folgende Programmbeispiel zeigt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String s;s = false
?"a" : "b";
java.lang.System.out.println( s ); }}
- Protokoll
b
Da das Fragezeichen »?« und der Doppelpunkt »:« für den mittleren Operanden wie ein Paar von Klammern sind, braucht jener mittlere Operand (oben das Literal »"a"«) nie eingeklammert zu werden.
Die Assoziativitätsrichtung des ternären Operators
Für den Anfang reicht es sich zu merken, daß ein weiterer ternärer Ausdruck als zweiter oder dritter Operand eines ternären Ausdrucks verwendet werden kann, ohne daß er eingeklammert werden muß, wie auch die folgenden Programmbeispiele zeigen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(false
?true
?"a" : "b" : "c"
); }}
- Protokoll
c
Oben ist der ternärer Operator mit den Operanden »true«, »a« und »b« der zweite Operand eines ternären Operators mit den weiteren Operanden »false« und »c«
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(false
?"a" : true
?"b" : "c"
); }}
- Protokoll
b
Oben ist der ternärer Operator mit den Operanden »true«, »b« und »c« der dritte Operand eines ternären Operators mit den weiteren Operanden »false« und »a«.
Ein ternärer Ausdruck, welcher der erste Operand eines anderen ternären Ausdrucks ist, ist in der Praxis seltener zu finden. Er könnte aber durchaus vorkommen und müßte dann eingeklammert werden.
Übungsfragen
? Übungsfrage 0
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(false
?8 : 9
); }}
? Übungsfrage 1
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(true
?2 : 3
); }}
? Übungsfrage 2
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println(true
?"L" : "R"
); }}
? Übungsfrage 3
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static int f(){ java.lang.System.out.println( "f" ); return 0; }
public static void eval( final int x ){}
public static void main( final java.lang.String[] args )
{ eval(f()
); }}
? Übungsfrage 4
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static int f(){ java.lang.System.out.println( "f" ); return 0; }
public static int g(){ java.lang.System.out.println( "g" ); return 0; }public static void eval( final int x ){}
public static void main( final java.lang.String[] args )
{ eval(0 * f() + 1 * g()
); }}
? Übungsfrage 5
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static int f(){ java.lang.System.out.println( "f" ); return 0; }
public static int g(){ java.lang.System.out.println( "g" ); return 0; }public static void eval( final int x ){}
public static void main( final java.lang.String[] args )
{ eval(false
?f() : g()
); }}
? Übungsfrage 6
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static boolean f(){ java.lang.System.out.println( "f" ); return true; }
public static void eval( final int x ){}public static void main( final java.lang.String[] args )
{ eval(f()
?4 : -6
); }}
? Übungsfrage 7
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
Main.java
public final class Main
{public static boolean f(){ java.lang.System.out.println( "f" ); return false; }
public static void eval( final int x ){}public static void main( final java.lang.String[] args )
{ eval(f()
?4 : -6
); }}
? Übungsfrage 8
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
Main.java
public final class Main
{public static void main( final java.lang.String[] args )
{ boolean x = true;int y =
x
?7 : 5
; java.lang.System.out.println( y ); }}
? Übungsfrage 9
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
Main.java
public final class Main
{public static void f( final int x )
{ final boolean v = x == 4;java.lang.System.out.println(
v
?"q" : "p"
); }
public static void main( final java.lang.String[] args )
{ f( 3 );
f( 4 );
f( 5 ); }}
? Übungsfrage 10 ⃖
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
Main.java
public final class Main
{public static java.lang.String f( final int a )
{ returna < 4
?"q" : "p"
; }
public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( f( 3 ));
java.lang.System.out.println( f( 4 ));
java.lang.System.out.println( f( 5 )); }}
? Übungsfrage 11 ⃖
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
Main.java
public final class Main
{public static boolean f(){ java.lang.System.out.println( "f" ); return false; }
public static int g(){ java.lang.System.out.println( "g" ); return 4; }
public static int h(){ java.lang.System.out.println( "h" ); return 7; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
(f()
?g() : h()
); }}
? Übungsfrage 12 ⃖
Welche Ausgabe erzeugt das folgende Programm voraussichtlich?
(Diese Aufgabe unterscheidet sich von der vorigen nur darin, daß sie »true« an Stelle von »false« verwendet.)
Main.java
public final class Main
{public static boolean f(){ java.lang.System.out.println( "f" ); return true; }
public static int g(){ java.lang.System.out.println( "g" ); return 4; }
public static int h(){ java.lang.System.out.println( "h" ); return 7; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
(f()
?g() : h()
); }}
? Übungsfrage 13
Welche Ausgabe erzeugt das folgende Programm?
Main.java
public final class Main
{public static int f( final boolean b ){ return b ? 4 : 3; }
public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( f( true ));
java.lang.System.out.println( f( false )); }}
Übungsaufgaben
/ Übungsaufgabe 0 ⃖
Schreiben Sie einen Ausdruck, dessen Wert »7« ist, falls der Ausdruck »x« den Wert »true« hat, und »2« sonst.
/ Übungsaufgabe 1
Schreiben Sie einen Ausdruck, dessen Wert »-4« ist, falls der Ausdruck »z« den Wert »false« hat, und »8« sonst.
/ Übungsaufgabe 2
Schreiben Sie einen Ausdruck, dessen Wert »"abc"« ist, falls der Ausdruck »i« größer als »4« ist, und »"def"« sonst.
/ Übungsaufgabe 3 ⃖
Schreiben Sie eine Deklaration einer Methode, die einen Parameter vom Typ »boolean« hat und die Zeichenfolge »n« ausgibt.
/ Übungsaufgabe 4 ⃖
Schreiben Sie eine Deklaration einer Methode, welche die Zeichenfolge »x« ausgibt, wenn sie mit »false« aufgerufen wird, und die Zeichenfolge »y« sonst.
/ Übungsaufgabe 5
Schreiben Sie eine Deklaration einer Methode, die einen Parameter vom Typ »boolean« hat und die Zeichenfolge »n« zurückgibt.
/ Übungsaufgabe 6
Schreiben Sie eine Deklaration einer Methode, welche die Zeichenfolge »x« ergibt, wenn sie mit »false« aufgerufen wird, und die Zeichenfolge »y« sonst.
/ Übungsaufgabe 7
Schreiben Sie eine Deklaration einer Methode, welche die Zeichenfolge »falsch« ergibt, wenn sie mit »false« aufgerufen wird, und die Zeichenfolge »wahr« sonst.
/ Übungsaufgabe 8
Schreiben Sie eine Deklaration einer Methode, die mit fünfzigprozentiger Wahrscheinlichkeit die Zeichenfolge »Kopf« zurückgibt, und sonst »Zahl«.
/ Übungsaufgabe 9
Schreiben Sie eine Deklaration einer Methode, die einen Ausdruck vom Typ »int« als Argument akzeptiert, dessen Wert eine Temperatur darstellen soll, 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 Methode übergebene Temperatur zwischen 0 und 99 liegt.