Die Subtraktion »…-…« in Java
Einführendes Beispiel
In Java kann auch eine Differenz in der gewohnten Schreibweise als Ausdruck verwendet werden.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1 - 1 ); }}java.lang.System.out
0
- Java
1-1
- auf deutsch:
- ● „Eins minus Eins“
Syntax
Ist A ein Additivausdruck a ein Multiplikativausdruck, so ist »A -a « wieder ein Ausdruck, die Differenz von A und a. Dabei wird A auch Minuenden und a Subtrahend genannt.
Die syntaktischen Eigenschaften des Subtraktionsoperators gleichen denen des Additionsoperators. (Die Subtraktion »-« ist linksassoziativ. Ihre Priorität ist niedriger als die der Division.)
Wir erweitern das Syntaxdiagramm für Ausdrücke um den Subtraktionsoperator »-« (Additivausdruck).
- Syntax (Syntaxdiagramm)
Primaerausdruck
.-. .----------. .-.
--->.--->( ( )--->| Ausdruck |--->( ) )--->.--->
| '-' '----------' '-' ^
| .----------. |
'------------>| Literal |-------------'
'----------'Vorzeichenausdruck
.--------------------.
---.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Multiplikativausdruck
.-----------------------.
---.--->| Vorzeichenausdruck |--------------------------------------.--->
| '-----------------------' ^
| .-----------------------. .-. .--------------------. |
'--->| Multiplikativausdruck |--->( * )--->| Vorzeichenausdruck |---'
| '-----------------------' '-' '--------------------' |
| .-----------------------. .-. .--------------------. |
'--->| Multiplikativausdruck |--->( / )--->| Vorzeichenausdruck |---'
'-----------------------' '-' '--------------------'Additivausdruck
.-----------------------.
---.--->| Multiplikativausdruck |-----------------------------------------.--->
| '-----------------------' ^
| .-----------------------. .-. .-----------------------. |
'--->| Additivausdruck |--->( + )--->| Multiplikativausdruck |---'
| '-----------------------' '-' '-----------------------' |
| .-----------------------. .-. .-----------------------. |
'--->| Additivausdruck |--->( - )--->| Multiplikativausdruck |---'
'-----------------------' '-' '-----------------------'Ausdruck
.-----------------.
--->| Additivausdruck |--->
'-----------------'
Syntax, Typanforderungen, Typergebnisse, Assoziativität und Priorität sind bei diesem binären Operator wie bei der Addition, nur daß hier keine Zeichenketten als Operanden erlaubt sind. Der Wert ist hingegen die Differenz der Werte der beiden Operanden.
Die folgende Tabelle faßt Informationen über die bisher vorgestellten Operatoren zusammen und kann auch verwendet werden, wenn es als zu mühevoll erscheint, den Syntaxdiagrammen die Informationen zu entnehmen.
In der Tabelle stehen Operatoren mit höherer Priorität weiter oben.
- 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
Man sagt ja auch: „Punktrechnung geht vor Strichrechnung.“ – „Punktrechnung“ umfaßt die Operatoren mit Punkten (die Multiplikation ‹ · › und die Division ‹ : ›) und „Strichrechnung“ die Operatoren mit Strichen (die Addition ‹ + › und die Subtraktion ‹ − ›).
Genauigkeit _
Die Subtraktion kann kleine Unterschiede zwischen zwei Werten verdeutlichen.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 9_007_199_254_740_992. - 9_007_199_254_740_991. ); }}Protokoll
1.0
Wenn die Zahlen zu groß werden, werden die hinteren Stellen vom Datentyp »double« nicht mehr korrekt dargestellt, so daß die Ergebnisse nach der Schulmathematik nicht mehr korrekt sind.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 9_007_199_254_740_993. - 9_007_199_254_740_992. ); }}Protokoll
0.0
Der Datentyp »double« stellt Zahlen mit Nachkommastellen auch nur näherungsweise dar. Die kleinen Unterschiede der Näherungen werden durch die Subtraktion hervorgehoben. Das Ergebnis der Rechnung ist nach der Schulmathematik ebenfalls wieder falsch.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 0.1 + 0.2 - 0.3 ); }}Protokoll
5.551115123125783E-17
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( ( 0.1 + 0.2 - 0.3 )*1E20 ); }}- Protokoll
5551.115123125783
Übungsfragen *
? Operanden *
Wie viele Operanden hat der Operator »-« im Ausdruck »8 - 2«?
- A: keinen.
- B: einen.
- C: zwei.
- D: drei.
Nennen Sie die Operanden im Ausdruck »8 - 2«!
Wie viele Operanden im Ausdruck »8 - 2« sind positiv?
- A: keiner.
- B: einer.
- C: zwei.
- D: drei.
Wie viele Operanden hat der Operator »-« im Ausdruck »8 - 2 / 3«?
- A: keinen.
- B: einen.
- C: zwei.
- D: drei.
Beispiele ⃗
● Gleichheitstest ⃗
Die Subtraktion kann gut verwendet werden, um zu erkennen, ob zwei Numeralia den gleichen Zahlenwert repräsentieren: Nur dann ist ihre Differenz gleich 0.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 - 2.00 ); }}transcript
0.0
Der Wert von »2« ist ja zunächst nicht gleich dem Wert von »2.00«, da beide Werte sich schon im Typ unterscheiden. Da bei dieser Subtraktion der Typ der beiden Operanden jedoch nach »double« angeglichen wird, ergibt sich dann doch das Ergebnis »0.0«.
● Punktnumeralia ⃗
Es wird noch einmal deutlich, daß verschiedene Literale denselben Wert haben können, also sind Literale nicht dasselbe wie ihre Werte.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2.0 - 1.9999999999999999 ); }}- Konsole
0.0