Die Division »…/…« in Java
Einführendes Beispiel
Die Division wird mit einem Schrägstrich »/« geschrieben. Der Schrägstrich »/« sollte nicht mit dem inversen Schrägstrich »\« verwechselt werden!
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 70/10 ); }}java.lang.System.out
7
- Java
70/10
- auf deutsch
- 70 geteilt durch 10
- in der Mathematik
- 70 ÷ 10
- 70 : 10
- 70∕10
70
----
10
Syntax
Wir hatten einen Operator bisher als ein Zeichen kennengelernt, das mit einem Operanden zusammen geschrieben wird. Nun erweitern wir den Begriff dahingehend, daß ein Operator auch zwei Operanden haben kann. Der Divisionsoperator wird zwischen seine beiden Operanden geschrieben.
Dies wird durch die folgende Produktionsregel »Multiplikativausdruck« wiedergegeben.
Sund A und a ein Vorzeichenausdrücke, so ist »A /a « wieder ein Ausdruck, der Quotient von A und a. Dabei wird A auch Dividend und a Divisor genannt.
Die Division »/« ist linksassoziativ. Ihre Priorität ist schwächer als die eines Vorzeichens.
Wir erweitern das Syntaxdiagramm für Ausdrücke um den Divisionsoperator »/« (Multiplikativausdruck).
- Neue, erweiterte Syntax (Syntaxdiagramm)
Primaerausdruck
.-. .----------. .-.
--->.--->( ( )--->| Ausdruck |--->( ) )--->.--->
| '-' '----------' '-' ^
| .----------. |
'------------>| Literal |-------------'
'----------'Vorzeichenausdruck
.--------------------.
---.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Multiplikativausdruck
.--------------------.
---.--->| Vorzeichenausdruck |--------------------------------------.--->
| '--------------------' ^
| .--------------------. .-. .--------------------. |
'--->| Vorzeichenausdruck |--->( / )--->| Vorzeichenausdruck |---'
'--------------------' '-' '--------------------'Ausdruck
.------------------------.
--->| Multiplikativausdruck |--->
'------------------------'
Eine Division wird im Syntaxdiagramm als Multiplikativausdruck bezeichnet, da die syntaktischen Eigenschaften des Divisionsoperators so sind wie die syntaktischen Eigenschaften des (bisher noch nicht vorgestellten) Multiplikationsoperators.
Wie schon beim Vorzeichenausdruck bezeichnen wir einen Multiplikativausdruck, der kein Vorzeichenausdruck ist, als einen echten Multiplikativausdruck. Beispielsweise ist das Literal »2« zwar ein Multiplikativausdruck, aber kein echter Multiplikativausdruck.
Begriffe zu Operatoren
Lücken
Man stellt sich vor, daß sich hinter dem Vorzeichenoperator »-« eine leere Stelle befindet, in die ein Operand eingefügt werden kann: »-…«. Eine Lücke (auch Stelle oder Parameter genannt) ist also ein Platz bei einem Operator, der einen Ausdruck aufnehmen kann. Ein Ausdruck wie »-25« entsteht durch Besetzung der Operandenstelle mit einem Operandenausdruck (hier mit dem Ausdruck »25«).
Beim Divisionsoperator »/« stellt man sich vor, daß er zwei Lücken besitzt (eine links und eine rechts vom Operatorzeichen, »…/…«) und sagt auch daß er zwei Operanden akzeptiere.
Ein Vorzeichenoperator hat eine Stelle.
- Ein Operator mit einer Stelle
- - …
Der Divisionsoperator hat zwei Stellen.
- Ein Operator mit zwei Stellen
- … / …
Die Parameter gehören zum Laufzeitmodell.
Arität
Die Anzahl der Stellen eines Operators bezeichnet man auch als die Arität jenes Operators.
Ein Operator mit genau einer Stelle wird einstellig oder unär genannt.
Ein Operator mit genau zwei Stellen wird zweistellig oder binär genannt.
Ein Vorzeichenoperator ist ein unärer Operator.
- Ein unärer Operator
- - …
Der Divisionsoperator ist ein binärer Operator.
- Ein binärer Operator
- … / …
Position
Ein Präfixoperator ist ein Operator, der vor seinen Operanden geschrieben wird. – Beispielsweise ist das Vorzeichen »-« ein Präfixoperator.
Weil der Divisionsoperator zwischen seinen Operandenausdrücken steht, wird er auch als ein Infixoperator bezeichnet.
Ein Vorzeichenoperator ist ein Präfixoperator.
- Ein Präfixoperator
- - …
Der Divisionsoperator ist ein Infixoperator.
- Ein Infixoperator
- … / …
Begriffe der Division
Sind D und d zwei Ausdrücke, so ist D /d wieder ein Ausdruck, der Quotient von D und d. Dabei wird D auch Dividend und d Divisor (diˈviːzoːʌ̯) genannt: „Dividend/Divisor“. (Diese vereinfachte Syntax bringt die Assoziativität der Division nicht richtig zum Ausdruck. Diese wird daher später separat erklärt.)
- Ein Quotient
Dividend
----------
Divisor
Merkhilfe: Der Dividend wird durch den Divisor geteilt. Der Dividend ist also passiv erleidend, während der Divsor aktiv ist (wie ein Motor ).
Typanforderungen
Der Dividend und der Divisor müssen beide jeweils numerisch sein (also jeweils den Typ »int« oder »double« haben).
Der Typ »long« wird in diesem Kurs nur für einige Beispiele verwendet und zur Vereinfachung ansonsten ignoriert. Daher wird »long« in dieser Lektion hier nicht in Zusammenhang mit dem Divisionsoperator behandelt.
Typregeln
Der Divisionsoperator »/« kann mit double - und mit int -Werten verwendet werden.
Ist der Typ mindestens einen Operanden »double«, so ist Typ des gesamten Ausdrucks »double«, sonst ist er »int«. (Daraus folgt insbesondere: Ist der Typ beider Operanden »double«, hat der gesamte Ausdruck den Typ »double«. Ist der Typ beider Operanden »int«, hat der gesamte Ausdruck den Typ »int«. Ist der Typ des einen Operanden »double« und der des anderen »int«, so ist der Typ des gesamten Ausdrucks »double«.)
- Typregeln
- mindestens ein double -Operand → Ergebnis double
nur int -Operanden → Ergebnis int - Typregeln (andere Formulierung)
- double /double → double
double /int → double
int /double → double
int /int → int - Typregeln (andere Formulierung)
- int / int → int
- double / … → double
- … / double → double
Auswertung
Verwendung mit zwei double-Operanden
Zunächst betrachten wir Fälle, in denen beide Operandenausdrücke den Typ »double« haben.
In diesem Fall ergibt die Division den normalerweise nach der Schulmathematik erwarteten Wert (manchmal nur näherungsweise).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1./2. ); }}java.lang.System.out
0.5
Verwendung mit zwei int-Operanden
Sind beide Operandenausdrücke int, bedeutet der Operator die „ganzzahlige Division“. Dabei werden die Nachkommastellen des Ergebnisses, das sich bei einer normalen Division ergeben würde, abgeschnitten (wir gehen hier zur Vereinfachung nicht auf die Situation bei negativen Zahlen ein).
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1/2 ); }}java.lang.System.out
0
Der ganzzahlige Anteil einer Division ‹x ∕y › wird in der Mathematik auch als ‹x ∖ y › geschrieben.
Verwendung mit verschiedenen Typen
Bei einer Mischung int /double oder double /int wird der int -Wert in den ihn entsprechenden double -Wert uminterpretiert (aus dem int -Wert »2« wird beispielsweise der double -Wert »2.0«.). Anschließend erfolgt dann eine double/double-Division.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1./2 ); }}java.lang.System.out
0.5
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 1/2. ); }}java.lang.System.out
0.5
Dieses Prinzip wird auch bei den anderen Operatoren für die Grundrechenarten angewendet, die wir in diesem Kapitel noch kennenlernen werden.
Allgemeine Beschreibung
Bei der Auswertung einer Division werden zunächst beide Operanden ausgewertet. Der Wert des Multiplikativausdrucks ist dann die Summe der erhaltenen Werte der Operanden.
Hat mindestens ein Operand den Typ ›double‹, so erfolgt die Division mit Nachkommastellen.
Der Wert einer Division mit einem double-Operanden ist (bis auf meist kleine Abweichungen) der normale Quotient der beiden Werte, der Wert einer int /int -Division jedoch nur der ganzzahlige Anteil dieses Quotienten.
(Falls das mathematisch korrekte Ergebnis im Wertebereich des Datentyps des Ergebnisses nicht darstellbar ist, wird an Stelle des mathematisch korrekten Ergebnisses ein Wert aus dem Wertebereich des Datentyps des Ergebnisses verwendet. Das Ergebnis ist dann nicht mathematisch korrekt. Die Details dieses Verfahrens sollen an dieser Stelle des Kurses noch nicht vertieft werden.)
Übungsfragen
? Übungsfrage
Welche Typen und Werte haben die folgenden Ausdrücke jeweils?
- A »2. / 8«
- B »2 / 8«
- Typregeln
- double /double → double
double /int → double
int /double → double
int /int → int
/ Operanden _
Welche Operanden gibt es in dem folgenden Ausdruck (es gibt insgesamt vier verschiedene Operanden)?
- Ausdruck
3/(2/4)
? Übungsfragen
Für die Beantwortung der folgenden Übungsfragen soll das unten stehende Syntaxdiagramm zugrundegelegt werden.
- Ist der Ausdruck »-2/3« ein Vorzeichenausdruck oder ein Multiplikativausdruck ?
- Welcher der beiden Ausdrücke »-2« und »2/3« ist in »-2/3« ein Operand ?
- Ist »2/4« ein Vorzeichenausdruck?
- Ist »2« ein Vorzeichenausdruck?
- Ist »(2/4)« ein Vorzeichenausdruck?
- Ist »2/(3/4)« ein Ausdruck?
- Syntax
Primaerausdruck
.-. .----------. .-.
--->.--->( ( )--->| Ausdruck |--->( ) )--->.--->
| '-' '----------' '-' ^
| .----------. |
'------------>| Literal |-------------'
'----------'Vorzeichenausdruck
.--------------------.
---.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Multiplikativausdruck
.--------------------.
---.--->| Vorzeichenausdruck |--------------------------------------.--->
| '--------------------' ^
| .--------------------. .-. .--------------------. |
'--->| Vorzeichenausdruck |--->( / )--->| Vorzeichenausdruck |---'
'--------------------' '-' '--------------------'Ausdruck
.------------------------.
--->| Multiplikativausdruck |--->
'------------------------'
Übungsaufgaben
/ Quotient
Berechnen Sie den Quotienten (mitsamt den korrekten Nachkommastellen) von Drei (Dividend) und Vier (Divisor) mit Hilfe eines Java -Programms.
Ausdrücken und Zitieren *
Das folgende Programm zeigt den Ausdruck eines Quotienten in Java.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( 2 / 4. ); }}Protokoll
0.5
Das folgende Programm zeigt das Zitat eines Quotientenausdrucks in Java.
Main.java
public final class Main
{ public static void main( final java.lang.String[] args )
{ java.lang.System.out.println
( "2 / 4." ); }}transcript
2 / 4.
Bei der Auswertung einer Zitierung ergibt sich der Quotientenausdruck, aber noch nicht den Quotientenwert. Eine zitierte Division müsste doppelt ausgewertet werden, um den Quotientenwert zu ergeben (was aber in Java nicht auf einfache Weise möglich ist).
Die Abstraktion des unsichtbaren Implementation (black box ) *
Der Operator »/« wird in der Regel nur dadurch beschrieben, welches Ergebnis er liefert. Die Technik, wie der Operator »/« es erreicht, das richtige Ergebnis zu „finden“ wird verborgen. Dadurch wird der Verwender dieses Operators davon entlastet, sich über die Details der Umsetzung Gedanken machen zu müssen.
Man kann dies mit einer Maschine wie beispielsweise einem Fahrstuhl vergleichen: Der Bediener muß nur wissen, welche Wirkung die einzelnen Knöpfe haben (er muß also nur die Oberfläche zur Bedienung kennen), aber nicht, wie die Technik das im einzelnen realisiert. Das Innere der Maschine ist für den Benutzer nicht sichtbar (abstrahiert).
Diese Abstraktion der „unsichtbaren Implementation“ (black box ) ist eine der wichtigsten Techniken, die in der Programmierung zur Beherrschung der Komplexität großer Programm eingesetzt wird.
Die Umsetzung von Methoden wird Implementation (hier wäre dies also die „Implementation der Addition“) genannt. Die Implementation wird in der Programmierung oft verborgen.