Die Syntax des ternären Operators in Java
Ein ternärer Ausdruck besteht aus einem Ausdruck, der lexikalischen Einheit Fragezeichen »?«, einem Ausdruck, der lexikalischen Einheit Doppelpunkt »:« und schließlich noch einem Ausdruck (in dieser Reihenfolge).
- Syntaxdiagramm (vereinfacht)
Ausdruck
.----------. .-. .----------. .-. .----------.
--->| Ausdruck |--->( ? )--->| Ausdruck |--->( : )--->| Ausdruck |--->
'----------' '-' '----------' '-' '----------'
Der ternären Ausdruck wird auch bedingter Ausdruck genannt.
Priorität
Die folgende Tabelle gibt die Assoziativität und Priorität der bisher behandelten Operatoren wieder. Für den ternären Operator gilt die Einordnung aber nur für seine erste Operandenstelle, wie weiter unten erläutert werden wird.
- Eigenschaften
S P A (S = Stelligkeit ("Aritaet"), P = Position, A = Assoziativitaet)
() 1 Z Eingeklammerter Ausdruck
+ - 1 P Unaere vorangestellte Operatoren (Vorzeichen)
* / 2 I L "Punktrechnung": Multiplikation, Division
+ - 2 I L "Strichrechnung": Addition, Subtraktion
< > 2 I L Vergleiche
== != 2 I L Gleichheitspruefung und Ungleichheitspruefung
?: 3 I R Ternaerer Operator
= 2 I R Zuweisung
Details zur Priorität
Die Priorität des ternären Operators ist etwas subtiler, da sie sich für die einzelnen Stellen des Operators unterscheidet.
Erste Stelle
In »a = b ? x : y« ist die Priorität des ternären Operators höher als die des Zuweisungsoperators »=«, es bedeutet also »a =( b ? x : y )«.
Ansonsten ist die Priorität des ternären Operators an dieser Stelle niedriger als die jedes anderen binären oder unären Operators »○« außer dem Zuweisungsoperator; Daher ist »a ○ b ? x : y« für einen binären Operator »○«, bei dem es sich nicht um den Zuweisungsoperator »=« handelt, dasselbe wie »( a ○ b )? x : y«.
Zweite Stelle
In »b ? … : z« ist die Priorität des ternären Operators niedriger als die jedes anderen Operators, da die beiden lexikalischen Einheiten »?« und »:« wie Klammern wirken. Daher ist »b ? … : z« stets dasselbe wie »b ?( … ): z«, falls »…« ein Ausdruck ist.
Dritte Stelle
In »b ? x : y = z« ist die Priorität des ternären Operators höher als die des Zuweisungsoperators, es bedeutet also »( b ? x : y )= z«.
Ansonsten ist die Priorität des ternären Operators an dieser Stelle niedriger als die jedes anderen binären oder unären Operators »○« außer dem Zuweisungsoperator; Daher ist »b ? x : y ○ z« für einen binären Operator »○«, bei dem es sich nicht um den Zuweisungsoperator »=« handelt, dasselbe wie »b ? x :( y ○ z )«.
Die Assoziativitätsrichtung
»b ? x : c ? y : z« könnte »( b ? x : c )? y : z« bedeuten, aber es bedeutet »b ? x : ( c ? y : z )«. In diesem Sinne ist der ternäre Operator rechtsassoziativ.
Main.java
public final class Main
{public static void main( final java.lang.String[] args )
{boolean b = true;
boolean d = false;
boolean x = true;
boolean y = false;
boolean z = true;java.lang.System.out.println(( b ? x : d )? y : z );
java.lang.System.out.println( b ? x : d ? y : z );
java.lang.System.out.println( b ? x : ( d ? y : z )); }}- Protokoll
false
true
true
Ausdrücke ⁺
Die Definition der syntaktischen Kategorie Ausdruck wird um Ausdrücke mit dem neu vorgestellten Operator erweitert.
- Syntaxdiagramm
Ausdruck
.----------.
---.------------------------------------------------------>| Literal |----.---->
| '----------' |
| .----------. |
'------------------------------------------------------>| Name |----'
| '----------' |
| .-. .----------. .-. |
'------------------->( ( )--->| Ausdruck |--->( ) )---------------------'
| '-' '----------' '-' |
| .-------. .-. .----------. .-. |
'--->| Name |------>( ( )--->| Liste |--->( ) )---------------------'
| '-------' '-' '----------' '-' |
| .-. .----------. |
'-------------------------------------------->( - )---->| Ausdruck |----'
| '-' '----------' |
| .-. .----------. |
'-------------------------------------------->( + )---->| Ausdruck |----'
| '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( / )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( + )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( - )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( * )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( < )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( > )---->| Ausdruck |----'
| '----------' '-' '----------' |
| .----------. .--. .----------. |
'---------------------------->| Ausdruck |--->( <= )--->| Ausdruck |----'
| '----------' '--' '----------' |
| .----------. .--. .----------. |
'---------------------------->| Ausdruck |--->( >= )--->| Ausdruck |----'
| '----------' '--' '----------' |
| .----------. .--. .----------. |
'---------------------------->| Ausdruck |--->( == )--->| Ausdruck |----'
| '----------' '--' '----------' |
| .----------. .--. .----------. |
'---------------------------->| Ausdruck |--->( != )--->| Ausdruck |----'
| '----------' '--' '----------' |
| .----------. .-. .----------. .-. .----------. |
'--->| Ausdruck |--->( ? )--->| Ausdruck |--->( : )---->| Ausdruck |----'
| '----------' '-' '----------' '-' '----------' |
| .----------. .-. .----------. |
'---------------------------->| Ausdruck |--->( = )---->| Ausdruck |----'
'----------' '-' '----------'
Übungsaufgabe
/ Übungsaufgabe
Schreiben Sie eine Inkarnation der im folgenden angegebenen Produktionsregel für die Kategorie „Ausdruck“ nieder.
- Syntaxdiagramm (vereinfacht)
Ausdruck
.----------. .-. .----------. .-. .----------.
--->| Ausdruck |--->( ? )--->| Ausdruck |--->( : )--->| Ausdruck |--->
'----------' '-' '----------' '-' '----------'