Der ternäre Operator in Java (Der ternäre Operator in Java), article, Seite 724110
https://www.purl.org/stefan_ram/pub/ternaere_java (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Java-Kurs

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 )
{ return

a < 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.

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724110 stefan_ram:724110 Der ternäre Operator in Java Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724110, slrprddef724110, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/ternaere_java