Die Division »…/…« in C
Einführendes Beispiel
Die Division wird mit einem Schrägstrich »/« geschrieben (in der Mathematik ist auch ‹÷› üblich). Der Schrägstrich »/« sollte nicht mit dem inversen Schrägstrich »\« verwechselt werden! Technisch handelt es sich um einen »Multiplikativausdruck« (obwohl es eine Division ist!).
- Syntax
Multiplikativausdruck
.--------------------. .-. .--------------------.
--->| Vorzeichenausdruck |--->( / )--->| Vorzeichenausdruck |--->
'--------------------' '-' '--------------------'main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", 70/10 ); }stdout
7
Syntax
- Syntax
Primaerausdruck
.----------.
---.------------>| Literal |------------.--->
| '----------' |
| .-. .----------. .-. |
'--->( ( )--->| Ausdruck |--->( ) )---'
'-' '----------' '-'Vorzeichenausdruck
.--------------------.
--->.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Multiplikativausdruck
.--------------------.
---.--->| Vorzeichenausdruck |--------------------------------------.--->
| '--------------------' ^
| .--------------------. .-. .--------------------. |
'--->| Vorzeichenausdruck |--->( / )--->| Vorzeichenausdruck |---'
'--------------------' '-' '--------------------'Ausdruck
.------------------------.
--->| Multiplikativausdruck |--->
'------------------------'
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 genannt: „Dividend/Divisor“. (Diese vereinfachte Syntax bringt die Linksassoziativität der Division nicht richtig zum Ausdruck. Diese wird daher weiter unten separat erklärt.) Dieser Operator hat zwei Operandenausdrücke (einen linken und einen rechten). Er wird daher binär genannt, während die zuvor vorgestellten Operatoren unär waren (sie hatten nur einen Operandenausdruck). Dieser Operator steht zwischen seinen Operandenausdrücken, daher wird er auch als ein Infixoperator bezeichnet.
Typanforderungen
Der Dividend und der Divisor müssen beide jeweils numerisch sein.
Typregeln und Semantik
Verwendung mit double-Operanden
Dieser Operator kann mit double- und int-Werten verwendet werden.
Zunächst betrachten wir Verwendungen, bei denen beide Operanden »double« sind.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%g\n", 1./2. ); }stdout
0.5
Verwendung mit unterschiedlichen Operandentypen
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]«.)
Man kann auch sagen, daß der Typ »double« „größer“ als der Typ »int« sei, weil er alle Wert des Typs »int« und noch weitere Werte umfaßt. Damit kann man dann sagen, daß bei der Verknüpfung zweier Werte der Wert des kleineren Typs zum Wert des größeren Typs erweitert wird.
- Typ der Division
double / double = double
int / double = double / double = double
double / int = double / double = double
Grundprinzip binärer Operatoren Bei allen binären Operatoren für Grundrechenarten wird bei einer Kombination eines int-Operanden mit einem double-Operanden, der Typ des int-Operanden so behandelt als wäre sein Typ »double« und der Wert jenes Operanden wird entsprechend nach »double« gewandelt.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%g\n", 1./2 ); }stdout
0.5
main.c
#include <stdio.h>
int main( void )
{ printf
( "%g\n", 1/2. ); }stdout
0.5
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", 1/2 ); }stdout
0
Der Wert einer double /double -Division 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.
Verwendung mit zwei int-Operanden
Sind beide Operandenausdrücke »int«, so hat der gesamte Ausdruck auch wieder den Typ »int«.
- Typ der Division
int / int = int
Der Typ der Division ist also »double«, wenn mindestens ein Operand den Typ »double« hat, und sonst »int«.
In diesem Fall bedeutet der Operator die „ganzzahlige Division“. Dabei werden die Nachkommastellen des Ergebnisses abgeschnitten.
- N2176 6.5.5 Multiplicative operators p6 *
- When integers are divided, the result of the / operator is the algebraic quotient with any fractional part discarded.
- [This is often called “truncation toward zero”.]
(Frühere Versionen von C gestatteten bei negativen Zahlen auch andere Rundungsarten.)
Operatorüberladung (Polymorphie)
Bei der Division steht ein und dasselbe Operatorzeichen für zwei unterschiedliche interne Programme: Wenn der Operator »/« zwei Operanden vom Typ »double« hat, steht er für die normale Division (mit Berücksichtigung von Nachkommastellen im Ergebnis), hat er aber zwei Operanden vom Typ »int«, steht er für die ganzzahlige Division (ohne Nachkommastellen im Ergebnis).
main.c
#include <stdio.h>
int main( void )
{ printf
( "%g\n", 1.0/2.0 ); }stdout
0.5
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", 1/2 ); }stdout
0
Die Auswahl eines internen Unterprogramms an Hand der Typen der Operanden bei dem gleichen Operationssymbol wird allgemein als ad-hoc Polymorphie bezeichnet. Im Falle von Operatoren (als Operationssymbolen) spricht man auch von Operatorüberladung. (Der Operator ist mit verschiedenen Bedeutungen sozusagen „überladen“ anstatt nur eine Bedeutung zu haben.)
Anmerkungen und Beispiele
Wandlung von »int« nach »double«
Das folgende Programm zeigt die Wandlung von »int« nach »double«: Dabei wird an den int-Wert praktisch die Nachkommastelle ».0« angehangen. Wird beispielsweise der »int«-Wert »7« nach double gewandelt, so entsteht der double-Wert »7.0«. In der Schulmathematik gelten beide Werte als gleich, aber in C unterscheiden sie sich durch ihre Typen.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%g\n", 7/1. ); }stdout
7
Die Division durch Null
In der Mathematik ist der Wert einer Division durch Null nicht definiert. Entsprechend ist auch das Verhalten einer Division durch Null in C nicht definiert.
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", 1/0 ); }- Zitat N1570 6.5.5 Multiplicative operators p5 *
- “if the value of the second operand is zero, the behavior is undefined.”,
Dies gilt auch für Gleitkommazahlen. Implementationen liefern bei einer Division durch »0.0« aber oft einen speziellen Wert, der für „Unendlich“ stehen soll.
Übungsfragen
? Ausdrücke
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
? Ü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 ein Operand in »-2/3«?
- Ist »2/4« ein Vorzeichenausdruck?
- Ist »2« ein Vorzeichenausdruck?
- Ist »(2/4)« ein Vorzeichenausdruck?
- Ist »2/(3/4)« ein Ausdruck?
- Syntax
Primaerausdruck
.----------.
---.------------>| Literal |------------.--->
| '----------' |
| .-. .----------. .-. |
'--->( ( )--->| Ausdruck |--->( ) )---'
'-' '----------' '-'Vorzeichenausdruck
.--------------------.
--->.------------>| Primaerausdruck |----.---->
| '--------------------' ^
| .-. .--------------------. |
'--->( - )--->| Vorzeichenausdruck |----'
| '-' '--------------------' |
| .-. .--------------------. |
'--->( + )--->| Vorzeichenausdruck |----'
'-' '--------------------'Multiplikativausdruck
.--------------------.
---.--->| Vorzeichenausdruck |--------------------------------------.--->
| '--------------------' ^
| .--------------------. .-. .--------------------. |
'--->| Vorzeichenausdruck |--->( / )--->| Vorzeichenausdruck |---'
'--------------------' '-' '--------------------'Ausdruck
.------------------------.
--->| Multiplikativausdruck |--->
'------------------------'
? Verständnis von Fachbegriffen *
Zu einem (hypothetischen) binären Infixoperator »∘« wird erklärt: „Der Wert eines Ausdrucks, der aus dem Operator »∘« sowie einem zu diesem Operator gehörenden linken und rechten Operanden besteht, ist der Wert des linken Operanden.“.
Welchen Wert hat demnach »4∘7«?
Welchen Wert hat »4∘2∘7«?
(Kürzere Formulierung der Erklärung: „Der Wert des Operator »∘« ist der Wert seines linken Operanden.“.)
Beispiel Die ganzzahligen Division *
- Abbildung von 47 Flaschen
o o o o o o o o o o o o o o o o o o o o o o o o
o o o o o o o o o o o o o o o o o o o o o o o- Abbildung von leeren Kartons
| | | | | | | | | | | | | | |
-|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|-
| | | | | | | | | | | | | | |- Abbildung elf gefüllter Kartons
o|o o|o o|o o|o o|o o|o o|o o|o o|o o|o o|o o o
-|- -|- -|- -|- -|- -|- -|- -|- -|- -|- -|-
o|o o|o o|o o|o o|o o|o o|o o|o o|o o|o o|o o
| | | |
-|- -|- -|- -|-
| | | |
47 Flaschen sollen in Kartons verpackt werden, die jeweils vier Flaschen aufnehmen können. Alle Kartons müssen immer vollständig mit jeweils vier Flaschen gefüllt werden, es ist also nicht erlaubt, daß ein Karton nur teilweise gefüllt wird. Wie viele Kartons können gefüllt werden?
main.c
#include <stdio.h>
int main( void )
{ printf
( "%d\n", 47/4 ); }stdout
11
Es können elf Kartons gefüllt werden.