Die Division in C (Die Division in C), Lektion, Seite 722918
https://www.purl.org/stefan_ram/pub/division_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
C-Kurs

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.

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.

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 stefanram722918 stefan_ram:722918 Die Division in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd722918, slrprddef722918, 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/division_c