Der ternäre Operator in Java
Der ternäre Operator enthält ein durch einen Doppelpunkt getrenntes Paar von Ausdrücken.
- ein durch einen Doppelpunkt getrenntes Paar von Ausdrücken
9 : 7
Durch einen Steuerungsausdruck vom Typ »boolean« kann einer dieser beiden Ausdrücke ausgewählt werden.
Der Steuerungsausdruck wird vor das Paar geschrieben und mit einem Fragezeichen von diesem getrennt.
- Ein Steuerungsausdruck vor einem Paar
true?
9 : 7
Ein wahrer Steuerungsausdruck wählt den linken Ausdruck aus, ein falscher den rechten.
- Ausdruck
true?
9 : 7- Wert
9
- Ausdruck
false?
9 : 7- Wert
7
Einleitendes Beispiel
Der ternäre Operator hat drei Operanden: einen vor einem Fragezeichen, einen vor einem Doppelpunkt und einem hinter jenem Doppelpunkt.
Er ergibt den Wert des Operanden vor dem Doppelpunkt, falls der Wert des ersten Operanden vor dem Fragezeichen »true« ist, und sonst den Wert des Operanden hinter dem Doppelpunkt.
In dem Programm »Main.java« ergibt sich als Wert des ersten bedingten Ausdrucks der Wert »1.«, denn da der Wert des Operanden vor dem Fragezeichen der Wert true ist, ist der Wert des gesamten Ausdrucks der Wert des Operanden vor dem Doppelpunkt »:«.
Der Wert des zweiten bedingten Ausdrucks ist der Wert »4«, denn da der Wert des ersten Operanden der Wert false ist, ist der Wert des ganzen Ausdrucks der Wert des Operanden nach dem Doppelpunkt.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( true ? 1 : 2 );
java.lang.System.out.println( false ? 3 : 4 ); }}System.out
1
4
Morphologie
Der ternäre Operator ist eine Ausnahme von der Regel, die besagt, daß jeder Operator immer eine lexikalische Einheit darstellt. Beim ternären Operator ist das Fragezeichen »?« und der Doppelpunkt »:« jeweils eine lexikalische Einheit für sich, wie man auch dem Syntaxdiagramm entnehmen kann. Der ternäre Operator besteht also aus zwei lexikalischen Einheiten.
Zuvor hatten wir schon den ebenfalls aus zwei lexikalischen Einheiten bestehenden Klammeroperator kennengelernt.
- Ein Klammerausdruck
Ausdruck
.-. .----------. .-.
--->( ( )--->| Ausdruck |--->( ) )--->
'-' '----------' '-'
Der Operator »==« besteht aus zwei zwei, die eine lexikalische Einheit bilden. Der ternäre Operator besteht aus zwei Zeichen, die zwei lexikalische Einheiten bilden.
Syntax (vereinfacht)
- EIn bedingter Ausdruck
Ausdruck
.-----------. .-. .------------. .-. .-------------.
--->| Ausdruck |--->( ? )--->| Ausdruck |--->( : )--->| Ausdruck |--->
'-----------' '-' '------------' '-' '-------------'
Der bedingte Ausdruck wird mit einem Operator mit drei Operanden geschrieben – einem ternären Operator. Zwischen dem ersten und dem zweiten Operanden wird ein Fragezeichen »?« geschrieben, zwischen dem zweiten und dem dritten Operanden wird ein Doppelpunkt »:« geschrieben.
Da es in Java nur einen ternären Operator gibt, und dieser Operator sonst keine Namen hat, wird er oft auch der ternäre Operator genannt.
Die Priorität dieses Operators wird gelegentlich als schwächer als die aller anderen Operatoren bis auf Zuweisungsoperatoren beschrieben, er wird auch manchmal als „rechtsassoziativ“ bezeichnet. Allerdings sind diese Begriffe zunächst nur für binäre Operatoren definiert und können auf ternäre Operatoren nicht direkt übertragen werden. In Zweifelsfällen sollten Klammern gesetzt werden. (Die genaue Syntax soll an dieser Stelle noch nicht behandelt werden.)
Typanforderungen
Der erste Operand muß vom Datentyp »boolean« sein. Die beiden anderen Operanden können jeden der bisher behandelten Typen haben.
Semantik (Wert)
Bei der Auswertung einer Anwendung dieses Operators wird zunächst der erste Operand ausgewertet.
Falls der Wert des ersten Operanden der Wert "true" ist, so wird nur noch der Wert des zweiten Operanden (des Operanden vor dem Doppelpunkt ) ausgewertet, andernfalls wird nur noch der Wert des dritten Operanden (des Operanden nach dem Doppelpunkt ) ausgewertet.
Der Wert des gesamten Ausdrucks ist dann der Wert des in den Typ des Ausdrucks gewandelten ausgewerteten Operanden, also der Wert des zweiten Operanden, falls der erste Operand den Wert »true«, und der Wert des dritten Operanden, sonst.
Die beiden letzten Operanden dieses Ausdrucks werden daher manchmal auch als seine beiden Zweige bezeichnet.
Der erste Operand dieses Operators wird bei der Auswertung einer Anwendung dieses Operators immer ausgewertet. Man sagt dazu auch, daß die erste Stelle dieses Operators strikt sei und die beiden letzten Stellen träge seien.
Ein Teil eines Ausdrucks ist träge, wenn jener Teil nur bei Bedarf ausgewertet wird.
Der Ausdruck wählt also aus, welcher der beiden Ausdrücke ausgewertet wird.
Bei diesem Operator ist also die erste Stelle strikt, und die beiden letzten Stellen sind träge.
- Der bedingte Ausdruck mit beschreibenden Begriffen
Entscheidung
.-----------. .-. .------------. .-. .-------------.
--->| Bedingung |--->( ? )--->| Konsequenz |--->( : )--->| Alternative |--->
'-----------' '-' '------------' '-' '-------------'
Steuerungsausdruck
Aussprache
- Java
x ? 1 : 2
- auf deutsch:
- „falls »x« (gilt), dann »1«, sonst »2«“
Trägheit der letzten beiden Operanden
Die beiden letzten Stellen dieses Operators sind träge, sie werden also nur bei Bedarf (bedingt) ausgewertet.
Das folgende Programm zeigt, daß von den vier println-Aufrufen im Hauptprogramm nur die Aufrufe »println( "R0" )« und »println( "L1" )« ausgewertet werden.
Main.java
public final class Main
{public static void eval( final int i ){ }
public static int println( final java.lang.String s )
{ java.lang.System.out.println( s ); return 1; }public static void main( final java.lang.String[] args )
{ eval( false ? println( "L0" ): println( "R0" ));
eval( true ? println( "L1" ): println( "R1" )); }}Protokoll
R0
L1
Das folgende Beispiel zeigt, wie die Trägheit des letzten Arguments verwendet werden kann, um nichtzulässige Operationen zu verhindern (der Wert einer Division durch 0 ist in der Mathematik nicht definiert).
Außerdem sieht man, wie das Ergebnis des ternären Operators durch Verkettung mit der leeren Kette »""« in einen java.lang.String -Wert gewandelt wird, damit es dann mit dem für die Methode kehrwert definierten Typ java.lang.String zurückgegeben werden kann. Diese Wandlung ist im Grundkurs nur ausnahmsweise nötig, weil der genaue Typ des ternären Operators in diesem Fall hier noch nicht behandelt werden soll.
Eine Division durch »0« kann in Java zu einem Programmabbruch führen, wie das folgende Programm zeigt.
Main.java
public final class Main
{public static java.lang.String kehrwertMalTausend( final int n )
{ return( 1000/n )+ ""; }public static void schreibKehrwertMalTausend( final int n )
{ java.lang.System.out.println
( "Der tausendfache Kehrwert von " + n + " ist " + kehrwertMalTausend( n )+ "." ); }public static void main( final java.lang.String[] args )
{ schreibKehrwertMalTausend( 2 );
schreibKehrwertMalTausend( 0 );
schreibKehrwertMalTausend( 2 ); }}Protokoll
Der tausendfache Kehrwert von 2 ist 500.
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Main.kehrwertMalTausend(Main.java:5)
at Main.schreibKehrwertMalTausend(Main.java:9)
at Main.main(Main.java:13)- Aussprachehinweis
- arithmetic əˈrɪθmətɪk (die voranstehende Aussprache gilt für das Substantiv, die Aussprache des Adjektivs lautet /ˌærɪθˈmɛtɪk/)
Wir hatten schon gesehen, daß die Ausgabe eines Aufrufs von »java.lang.Thread.dumpStack« das Wort »Exception« beinhalten. Dort bedeutete es ausnahmsweise keine Fehlermeldung. In der Regel informatiert die Ausgabe einer Meldung mit dem Wort »Exception« aber über einen Fehler, der erst während der Ausführung des Programmes beobachtet wurde und so schwerwiegend ist, daß das Programm sofort abgebrochen werden muß (der dritte Aufruf von »schreibKehrwertMalTausend« wird nicht mehr ausgeführt).
Das folgende Programm zeigt, daß der Programmabbruch durch einen bedingten Ausdruck verhindert werden kann.
Main.java
public final class Main
{public static java.lang.String kehrwertMalTausend( final int n )
{ return( n == 0 ? "undefiniert" : 1000/n )+ ""; }public static void schreibKehrwertMalTausend( final int n )
{ java.lang.System.out.println
( "Der tausendfache Kehrwert von " + n + " ist " + kehrwertMalTausend( n )+ "." ); }public static void main( final java.lang.String[] args )
{ schreibKehrwertMalTausend( 2 );
schreibKehrwertMalTausend( 0 );
schreibKehrwertMalTausend( 2 ); }}transcript
Der tausendfache Kehrwert von 2 ist 500.
Der tausendfache Kehrwert von 0 ist undefiniert.
Der tausendfache Kehrwert von 2 ist 500.
Wenn die letzte Stelle des ternären Operators nicht träge wäre, so würde sie in jedem Falle ausgewertet werden, auch wenn der Wert dann nicht verwendet wird. Dies könnte aber zu einem Programmabbruch führen, wie das frühere Programmbeispiel zeigte.
Die Trägheit der letzten Stelle dieses Operators bedeutet, daß in »true ? x : 1/x«, die Division nie vollzogen wird. Entsprechend bedeutet die Trägheit der vorletzten Stelle dieses Operators, daß in »false ? 1/x : x«, die Division nie vollzogen wird.
Daß nur einer der beiden letzten Operanden ausgewertet wird, kann man sich aus so vorstellen: Wenn die Auswertung des ersten Operanden keine Zeit kostet, und die Auswertung der letzten beiden Operanden jeweils eine Sekunde, dann dauert die Auswertung des gesamten Operatorausdrucks nur eine Sekunde und nicht zwei Sekunden.
Aussagen zur Gleichheit von double-Werten sind in der Regel nicht sinnvoll, eine Ausnahme sind aber in manchen Fällen Aussagen zur Gleichheit mit »0.0«, etwa um durch vorherige Prüfung eine Division durch »0.0« zu verhindern (wie das geht, wird später gezeigt werden).
Beispiel Verschachtelung ternärer Operatoren
Das folgende Beispiel zeigt die Verschachtelung ternärer Operatoren.
Main.java
public final class Main
{public static java.lang.String deutsch( final int a )
{ return a == 0 ? "Null":
a == 1 ? "Eins":
"Zwei"; }public static void print( final int a )
{ java.lang.System.out.println( a + " ist " + deutsch( a )+ "." ); }public static void main( final java.lang.String[] args )
{ print( 0 ); print( 1 ); print( 2 ); }}java.lang.System.out
0 ist Null.
1 ist Eins.
2 ist Zwei.
Beispiel Glücksspiel
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( java.lang.Math.floor( java.lang.Math.random() * 4 )== 0.0?
"Gratuliere! Sie haben gewonnen!":
"Schade, Sie haben leider verloren!" ); }}transcript
Schade, Sie haben leider verloren!
transcript
Schade, Sie haben leider verloren!
transcript
Schade, Sie haben leider verloren!
transcript
Gratuliere! Sie haben gewonnen!
Das folgende Beispiel zeigt, daß der bedingte Ausdruck auch als Initialisierungsausdruck in einer Konstantendeklaration verwendet werden kann.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ final java.lang.String result =
java.lang.Math.floor( java.lang.Math.random() * 4 )== 0.0?
"Gratuliere! Sie haben gewonnen!":
"Schade, Sie haben leider verloren!";java.lang.System.out.println( result ); }}
Das folgende Beispiel zeigt den bedingten Ausdruck als Rückgabeausdruck.
Main.java
public final class Main
{ public static java.lang.String result()
{ return
java.lang.Math.floor( java.lang.Math.random() * 4 )== 0.0?
"Gratuliere! Sie haben gewonnen!":
"Schade, Sie haben leider verloren!"; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( result() ); }}
Übungsfragen
? Übungsfrage 0
Was ist der Wert von »true ? 8 : 2«?
? Übungsfrage 1
Was ist der Wert von »false ? 12 : 9«?
? Übungsfrage 2
Was ist die Ausgabe des folgenden Programmes?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 == 2 ? "Ok." : "Fehler." ); }}
? Übungsfrage 3
Was ist die Ausgabe des folgenden Programmes?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 == 3 ? "Fehler." : "Ok." ); }}
? Übungsfrage 4
Was ist die Ausgabe des folgenden Programmes?
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "C" +( 2 == 2 ? "B" : "A" )+ "D" ); }}
? Übungsfrage 5
Was gibt das folgende Programm aus?
Main.java
public final class Main
{public static java.lang.String isNull( final int x )
{ return( x == 0 ? "" : "nicht-" )+ "null"; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( isNull( 0 ));
java.lang.System.out.println( isNull( 1 )); }}
? Übungsfrage 6
Main.java
public final class Main
{public static java.lang.String isNull( final int x )
{ return( x == 0 ? "" : "nicht-" )+ "null"; }public static void print( final int x )
{ java.lang.System.out.println( x + " ist " + isNull( x )+ "." ); }public static void main( final java.lang.String[] args )
{ print( 0 );
print( 1 ); }}
? Übungsfrage 7 *
Was ist die Ausgabe des folgenden Programms?
Main.java
public final class Main
{public static void werteAus( final int b ){}
public static boolean druckHallo()
{ java.lang.System.out.print( "Hallo" ); return false; }public static void main( final java.lang.String[] args)
{ werteAus( druckHallo() ? 0 : 1 ); }}
Warum ist der Parametertyp von »werteAus(int)« gleich »int« während der Rückgabetyp von »druckHallo()« doch »boolean« ist?
Warum ist die Methode »werteAus« überhaupt nötig, wenn sie weder einen Wert noch eine Wirkung hat? Könnte denn nicht statt »werteAus( druckHallo() ? 0 : 1 );« auch »druckHallo() ? 0 : 1;« verwendet werden?
Übungsaufgaben
Diese Übungsaufgaben sollten möglichst ohne Vorgriffe, also mit den bisher behandelten Sprachelementen gelöst werden.
/ Schreiben eines bedingten Ausdrucks (Syntax) ⃖
Schreiben Sie einen bedingten Ausdruck mit der Bedingung »v« (einem Ausdruck), der Konsequenz »a« (einem Ausdruck) und der Alternative »2« (einem Ausdruck). Dieser bedingte Audruck soll von Leerzeilen umgeben sein.
- Der bedingte Ausdruck mit beschreibenden Begriffen
Entscheidung
.-----------. .-. .------------. .-. .-------------.
--->| Bedingung |--->( ? )--->| Konsequenz |--->( : )--->| Alternative |--->
'-----------' '-' '------------' '-' '-------------'
Steuerungsausdruck
/ Schreiben eines bedingten Ausdrucks (Semantik) ⃖
Schreiben Sie einen bedingten Ausdruck der »12« ergibt, falls der Wert einer Auswertung von »java.lang.Math.random()« kleiner als ein Drittel ist und »8« sonst.
Dieser Ausdruck soll auf einer von Leerzeilen umgebenden Zeile stehen.
/ Eine Methode ⃖
Schreiben Sie eine Deklaration einer Methode »f«, die »17« ergibt.
/ Eine willkürliche Methode
Schreiben Sie eine Deklaration einer Methode »f«, die »17« ergibt, falls ihr Argumentwert »7« ist, und sonst »12«.
Falls die Deklaration der Methode »f« in den folgenden Testrahmen eingesetzt wird, sollte bei Ausführung des sich ergebenden Programmes »richtig« ausgegeben werden.
Main.txt
public final class Main
{__________
public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( f( 7 )== 17 ? f( 5 )== 12 ? f( -5 )== 12 ? "richtig"
: "falsch" : "falsch" : "falsch" ); }}
/ Eine Methode (1)
Schreiben Sie eine Deklaration einer Methode »f«, die »17« ausgibt.
/ Eine willkürliche Methode (1)
Schreiben Sie eine Methode »g«, die 17 ausgibt, falls ihr Argumentwert 7 ist, und sonst 12. Verwenden Sie dazu die Lösung der vorigen Übungsaufgabe, ohne diese zu verändern.
/ Umwandlungsmethode
Schreiben Sie eine Deklaration einer Methode namens »int_of«, welche einen Argumentwert vom Typ ›boolean‹ in den Typ ›int‹ wandelt. Der Wert der Methode soll «1» für den Argumentwert «true» und «0» für den Argumentwert «false» sein.
/ Umwandlungsmethode (1)
Schreiben Sie eine Deklaration einer Methode namens »boolean_of«, welche einen Argumentwert vom Typ ›int‹ in den Typ ›boolean‹ wandelt. Der Wert der Methode soll «false» für den Argumentwert «0» und sonst «true» sein.
/ Textdarstellung von Schulnoten ⃗
Schreiben Sie mit Hilfe des ternären Operators eine Wertmethode, welche dem Argumentwert »1« die Zeichenfolge »"sehr gut"« und dem Argumentwert »2« die Zeichenfolge »gut« zuordnet.
/ Textdarstellung von Schulnoten (1) ⃗
Schreiben Sie mit Hilfe des ternären Operators eine Wertmethode, welche dem Argumentwert »1« die Zeichenfolge »"sehr gut"«, dem Argumentwert »2« die Zeichenfolge »gut« und dem Argumentwert »3« die Zeichenfolge »befriedigend« zuordnet.
/ Übungsaufgabe
Schreiben Sie eine Methode, die eine ganze Zahl als Argument akzeptiert. Man kann sich vorstellen, daß diese Zahl das Alter einer Person in Jahren angeben soll.
Wenn die übergebene Zahl negativ ist, soll zurückgegeben werden: »nicht akzeptabel«.
Sonst soll zurückgegeben werden: »akzeptabel«.
Zusatzanforderung: Auch bei einem Alter von mehr als 125 Jahren soll ausgegeben werden: »nicht akzeptabel«.
Zusatzanforderung: Schreiben Sie eine weitere Methode, die so wie die vorige Methode ist, aber den Text ausgibt und nicht zurückgibt. Rufen Sie in dieser weiteren Methode die erste Methode auf, um den auszugebenden Text zu ermitteln.
/ Wandlung von boolean nach int ⃗
Schreiben Sie mit Hilfe des ternären Operators eine Wertmethode, welche dem Argumentwert »false« das Ergebnis »0« und dem Argumentwert »true« das Ergebnis »1« zuordnet.
/ Wandlung von boolean nach java.lang.String ⃗
Schreiben Sie mit Hilfe des ternären Operators eine Wertmethode, welche dem Argumentwert »false« das Ergebnis »"falsch"« und dem Argumentwert »true« das Ergebnis »"wahr"« zuordnet.
/ Zahlen auf deutsch ⃗
Erweitern Sie das folgende Programm um die Zahlenwörter „Drei“ und „Vier“!
Main.java
public final class Main
{public static java.lang.String deutsch( final int a )
{ return a == 0 ? "Null":
a == 1 ? "Eins":
"Zwei"; }public static void print( final int a )
{ java.lang.System.out.println( a + " ist " + deutsch( a )+ "." ); }public static void main( final java.lang.String[] args )
{ print( 0 ); print( 1 ); print( 2 ); }}
/ Teilbarkeit ⃗
Schreiben Sie die Deklaration einer Methode »d2«, so daß der Wert des Ausdrucks »d2( j )« genau dann true ist, wenn »j« durch »2« teilbar ist.
/ Schaltjahr ⃗
Schreiben Sie die Deklaration einer Methode »schaltjahr«, so daß der Wert des Ausdrucks »schaltjahr( j )« genau dann true ist, wenn »j« ein Schaltjahr war (Diese Methode braucht nur für Jahreszahlen von 2001 bis 2099 richtige Ergebnisse zu liefern).
/ Sternchen ⃗
- Schreiben Sie mit Hilfe des ternären Operators eine Methode, die so viele Sternchen »*« ausgibt, wie der Wert ihres ganzzahligen nicht-negativen Arguments angibt.
/ Urteil ⃗
Schreiben Sie mit Hilfe des ternären Operators eine parametrisierte Wertmethode, welche die Zeichenfolge »negativ«, »Null« oder »positiv« zurückgibt, je nachdem was für ihr Argument zutrifft.
Zusatzanforderung Schreiben Sie dann noch eine parametrisierte Wirkmethode, welche das Ergebnis der zuvor geschriebene Wertmethode für ihr Argument ausgibt.
/ Maximum zweier Zahlen ⃖
Ergänzen sie die Deklaration der parametrisierten Wertmethode »max« in dem folgenden Programmgerüst, so daß jene Wertmethode »max« das Maximum ihrer beiden Argumente vom Typ »int« zurückgibt. Im Rumpf jener Wertmethode dürfen bei dieser Aufgabe keine anderen Methoden aufgerufen werden.
Bei Ausführung des sich ergebenden Programmes sollte dann »richtig« ausgegeben werden.
Main.txt
public final class Main
{public static int max( final int x, final int y )
__________public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( max( 2, 3 )== 3 ? max( 3, 2 )== 3 ? max( 3, 3 )== 3 ? "richtig"
: "falsch" : "falsch" : "falsch" ); }}
/ Maximum dreier Zahlen ⃗
Schreiben Sie mit Hilfe des ternären Operators eine parametrisierte Wertmethode, welche das Maximum ihrer drei Argumente vom Typ »int« zurückgibt. Im Rumpf jener Wertmethode dürfen bei dieser Aufgabe keine anderen Methoden aufgerufen werden.
Zusatzanforderung Schreiben Sie dann noch eine parametrisierte Wirkmethode, welche das Ergebnis der zuvor geschriebene Wertmethode für ihr Argument ausgibt.
Zusatzaufgaben *
Diese Zusatzaufgaben sollten möglichst ohne Vorgriffe, also mit dem bisher behandelten Sprachelementen gelöst werden. (Da der Autor selber noch nicht alle Aufgaben bearbeitet hat, ist es nicht sicher, daß sich alle auf diese Weise lösen lassen. Es wird aber erwartet, daß dies möglich ist.)
/ Die Fakultät *
Definieren Sie eine Methode zur Berechnung der Fakultät einer natürlichen Zahl »n«, die der folgenden mathematischen Definition möglichst nahekommt.
- Mathematische Definition der Fakultät
.-
| n * f( n - 1 ), falls n nicht 0 ist
f( n ) = <
| 1, sonst
'-
Datentypen *
Die anderen beiden Operanden können beide vom Datentyp boolean sein, und dann hat das Ergebnis auch den Typ boolean. Die beiden letzten Operanden können beiden numerisch sein, und dann ist der Typ double, wenn einer der beiden letzten Operanden double ist, und int, wenn beide int sind. Wenn die beiden letzten Operanden den Typ java.lang.String haben, dann ist der Typ des gesamten Ausdrucks ebenfalls java.lang.String. Keiner der beiden letzten Operanden darf den Metatyp »void« haben.
Falls einer der beiden letzten Operanden den Typ java.lang.String hat und der andere nicht, so ist der Typ des Ausdrucks ein etwas komplizierterer Typ, der erst später behandelt werden soll. Er läßt sich aber durch Verkettung mit der leeren Zeichenkette in einen Ausdruck vom Typ java.lang.String wandeln, so daß wir diesen Typ wie java.lang.String nutzen können, wenn wir ihn noch in einen java.lang.String -Ausdruck wandeln. Dazu folgt weiter unten ein Beispiel.
gesamter Ausdruck erster Ausdruck zweiter Ausdruck dritter Ausdruck
boolean boolean boolean boolean
int boolean int int
double boolean int double
double boolean double int
double boolean double double
java.lang.String boolean java.lang.String java.lang.String
(java.lang.String) boolean java.lang.String boolean
(java.lang.String) boolean java.lang.String int
(java.lang.String) boolean java.lang.String double
(java.lang.String) boolean boolean java.lang.String
(java.lang.String) boolean int java.lang.String
(java.lang.String) boolean double java.lang.String
Illustration der Trägheit des ternären Operators *
Das folgende Programm zeigt, daß die Addition strikt ist, also alle ihre Operandenausdrücke auswertet.
Main.java
public final class Main
{public static int f0(){ java.lang.System.out.println( "f0" ); return 0; }
public static int f1(){ java.lang.System.out.println( "f1" ); return 1; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( f0() + f1() ); }}transcript
f0
f1
1
Das folgende Programm zeigt, daß der ternäre Operator träge ist, also nicht alle seine Operandenausdrücke auswertet.
Main.java
public final class Main
{public static boolean bf(){ java.lang.System.out.println( "bf" ); return false; }
public static boolean bt(){ java.lang.System.out.println( "bt" ); return true; }
public static int f0(){ java.lang.System.out.println( "f0" ); return 0; }
public static int f1(){ java.lang.System.out.println( "f1" ); return 1; }public static void main( final java.lang.String[] args )
{ java.lang.System.out.println( bf() ? f0() : f1() );
java.lang.System.out.println();
java.lang.System.out.println( bt() ? f0() : f1() ); }}transcript
bf
f1
1
bt
f0
0