Zum Inhalt springen
Topos Uranos

Zusammenfassung

Ein arithmetischer Ausdruck wird nicht von links nach rechts berechnet, wie man ihn liest, sondern nach einer verborgenen Struktur, seinem Baum, den der Vorrang der Operatoren, ihre Assoziativität und die Klammern festlegen; und in jedem Knoten dieses Baums entscheidet der Typ der Operanden, welche Operation ausgeführt wird, sodass 7 / 2 den Wert 3 und 7 / 2.0 den Wert 3.5 hat. Diese Lektion behandelt die fünf arithmetischen Operatoren von C++ mit ganzen und mit reellen Zahlen; die ganzzahlige Division und den Rest, die seit C++11 zur Null hin abschneiden, woraus folgt, dass der Rest das Vorzeichen des Dividenden annimmt und sich vom Rest der euklidischen Division unterscheidet, wenn der Dividend negativ ist; den Weg zum euklidischen Rest; den Baum eines Ausdrucks; den Typ des Ergebnisses, wenn die Operanden verschiedene Typen haben, und die beiden Arten, auf die ein ganzzahliger arithmetischer Ausdruck seine Bedeutung verliert: durch null dividieren und in einer Zwischenrechnung überlaufen.

Lernziele

  1. Den Quotienten und den Rest der ganzzahligen Division in C++ berechnen, auch mit negativen Operanden, und sie mit dem Quotienten und dem Rest der euklidischen Division in Beziehung setzen.
  2. Den Baum eines arithmetischen Ausdrucks nach Vorrang und Assoziativität zeichnen und seinen Wert berechnen.
  3. Den Typ des Ergebnisses einer Operation zwischen Operanden verschiedener Typen vorhersagen.
  4. Die ganzzahlige Division und den Rest nutzen, um Größen zu zerlegen: die Ziffern einer Zahl, eine Dauer in Stunden und Minuten, einen Wochentag.

Die arithmetischen Operatoren

C++ hat fünf binäre arithmetische Operatoren: die Addition +, die Subtraktion -, die Multiplikation *, die Division / und den Rest %; dazu kommen das unäre Minus, das das Vorzeichen seines einzigen Operanden ändert, wie in -x, und ein unäres Plus, +x, das ihn lässt, wie er ist. Die ersten vier gelten für ganze und für reelle Zahlen; der Rest nur für ganze. Nun bezeichnet dieselbe Schreibweise nicht in allen Fällen dieselbe Operation: Sind beide Operanden von / ganze Zahlen, so ist die Division ganzzahlig, und ihr Ergebnis ist eine ganze Zahl, der Quotient ohne seinen Nachkommaanteil; ist einer von ihnen reell, so ist die Division reell. Die Lektion Zeichen, boolesche Werte, Umwandlungen und Konstanten hat die sichtbarste Folge dieser Regel gezeigt, nämlich dass double r{7 / 2}; den Wert 3 speichert: Die Division wurde zwischen ganzen Zahlen ausgeführt, bevor das Ergebnis in eine reelle Zahl konvertiert wurde.

BeispielDie fünf Operatoren mit zwei ganzen Zahlen

Das Programm wendet die fünf Operatoren auf 17 und 5 an und wiederholt die Division mit einem reellen Dividenden.

C++-Programm
#include <print>​int main(){    const int a{17};    const int b{5};    std::println("{} + {} = {}", a, b, a + b);    std::println("{} - {} = {}", a, b, a - b);    std::println("{} * {} = {}", a, b, a * b);    std::println("{} / {} = {}", a, b, a / b);    std::println("{} % {} = {}", a, b, a % b);    const double x{17.0};    std::println("{} / {} = {}", x, b, x / b);}
Ausgabe
17 + 5 = 2217 - 5 = 1217 * 5 = 8517 / 5 = 317 % 5 = 217 / 5 = 3.4

17 durch 5 ergibt 3, und es bleiben 2 übrig: Das sind der Quotient und der Rest, wenn man 17 Gegenstände in Gruppen zu 5 aufteilt. Die letzte Zeile dividiert eine reelle Zahl durch eine ganze und erhält 3.4. Zu beachten ist, dass std::println die reelle Zahl 17.0 als „17“ schreibt: Der leere Platzhalter schreibt die kürzeste Darstellung des Werts, sodass das Geschriebene den Typ nicht verrät; um ihn zu sehen, verlangt man Nachkommastellen mit {:.1f}.

Der Operator % lässt keine reellen Zahlen zu. 7.5 % 2 zu schreiben, ist kein Logikfehler, den das Programm bei der Ausführung entdeckt, sondern ein Kompilierfehler: Der Compiler sagt, dass Operanden der Typen double und int für den Operator ungültig sind.

C++-Programm
#include <print>​int main(){    std::println("{}", 7.5 % 2);}
Fehlermeldungen des Compilers
main.cpp: In function ‘int main()’:main.cpp:5:28: error: invalid operands of types ‘double’ and ‘int’ to binary ‘operator%’    5 |     std::println("{}", 7.5 % 2);      |                        ~~~ ^ ~

Den Rest einer reellen Division gibt es, und ihn berechnet die Funktion std::fmod aus dem Header <cmath>, die in der Lektion Bits und Mathematikbibliothek behandelt wird, zusammen mit der Potenz: C++ hat keinen Potenzoperator, und 2 ^ 3 ist nicht 8, sondern etwas anderes, das dort erklärt wird.