Division in C++

Adnan Ashraf 12 Oktober 2023
  1. Vorrang- und Assoziativitätsregeln in C++
  2. Besonderheit der Integer-Division in C++
  3. Typumwandlung und Lösung der Besonderheit der Integer-Division in C++
Division in C++

In diesem Artikel geht es um Divisionsregeln in C++.

Zunächst werden wir uns die Vorrang- und Typisierungsregeln für die Division ansehen. Später werden wir eine gängige Besonderheit der Ganzzahldivision diskutieren, die als Cut-Off-Cast bekannt ist.

Vorrang- und Assoziativitätsregeln in C++

Der Begriff Vorrang gibt die Auswertungsreihenfolge von Operatoren in einem Ausdruck an. Einige der Vorrangregeln für C++-Operatoren von der höchsten Ebene zur niedrigsten Ebene lauten beispielsweise wie folgt:

  1. Ausdrücke in Klammern werden zuerst ausgewertet.
  2. Die Operatoren * und \ haben die gleiche Prioritätsstufe.
  3. Ebenso haben die Operatoren + und - die gleiche Prioritätsstufe.
  4. Wenn in einem Ausdruck zwei Operatoren mit gleicher Prioritätsstufe vorkommen, werden die Operatoren von links nach rechts ausgewertet (mit Ausnahme des Zuweisungsoperators (=). Dies wird auch als Operatorassoziativität bezeichnet.

Betrachten Sie beispielsweise den folgenden gemischten Ausdruck:

(1*2)+3/3*2-1

Der obige Ausdruck wird wie folgt ausgewertet:

  1. Beim ersten Durchlauf wird zuerst der Operator * ausgewertet, da dieser mit der höchsten Prioritätsstufe in Klammern eingeschlossen ist. Nach dem ersten Durchgang wird der Ausdruck wie folgt 2+3/3*2-1.

  2. Der Operator / wird erst im zweiten Durchlauf ausgewertet. Obwohl die Operatoren * und / dieselbe Vorrangstufe haben, werden die Operatoren mit gleicher Vorrangstufe von links nach rechts ausgewertet.

    Nach dem zweiten Durchlauf sieht der Ausdruck wie 2+1*2-1 aus.

  3. Im dritten Durchlauf wird der Multiplikationsoperator ausgewertet, da er unter den anderen Operatoren im Ausdruck den höchsten Vorrang hat. Nach dem dritten Durchgang würde sich der Ausdruck auf 2+2-1 reduzieren.

  4. Der +-Operator wird erst im vierten Durchlauf ausgewertet. Obwohl die Operatoren + und - dieselbe Vorrangstufe haben, werden die Operatoren mit gleicher Vorrangstufe von links nach rechts ausgewertet.

    Nach dem vierten Durchgang wird der Ausdruck zu 4-1.

  5. Schließlich wird der Operator - ausgewertet, und wir erhalten den Ausdruck auf einen einzigen Wert von 3 reduziert.

Jetzt haben wir genügend Hintergrundwissen zu Operatorvorrang und Assoziativität. Schauen wir uns einige der Besonderheiten des /-Operators in C++ an.

Besonderheit der Integer-Division in C++

Wenn wir zwei ganze Zahlen in C++ dividieren, gibt der Divisionsoperator nur den ganzzahligen Teil der Antwort zurück. Der Bruchteil der Antwort wird abgeschnitten.

Der Hauptgrund ist die implizite Typumwandlung durch den Compiler. Bevor wir uns mit der Typumwandlung befassen, wollen wir uns ein Beispiel für eine ganzzahlige Division ansehen.

#include <iostream>
using namespace std;

int main() {
  int m = 10;
  int n = 7;
  float a = m / n;
  cout << "The answer after division is:" << a << endl;
}

Ausgang:

The answer after division is:1

Die Ausgabe bestätigt, dass der C++-Compiler den Bruchteil der Antwort überspringt. Lassen Sie uns zunächst die Typumwandlung verstehen, um die Grundursache dieser Besonderheit und mögliche Lösungen zu verstehen.

Typumwandlung und Lösung der Besonderheit der Integer-Division in C++

Typecasting bedeutet, den Typ einer Variablen zu ändern. Die Typumwandlung kann entweder implizit oder explizit sein.

Explizite Typumwandlung

Dies wird explizit von den Programmierern durchgeführt. Das Schlüsselwort static_cast wird für die explizite Typumwandlung verwendet.

Diese Art des Castings wird zur Kompilierzeit durchgeführt.

Der folgende Code löst das Problem der ganzzahligen Division durch explizite Typumwandlung. Zeile 6 des folgenden Codes wandelt die Werte von m und n statisch in Fließkommawerte um; Daher ist das Ergebnis der Division auch eine Gleitkommazahl.

#include <iostream>
using namespace std;

int main() {
  int m = 10;
  int n = 7;
  float a =
      static_cast<float>(m) / static_cast<float>(n);  // static explicit casting
  cout << "The answer after explicit typecasting is: " << a << endl;
}

Ausgang:

The answer after explicit typecasting is: 1.42857

Implizite Typumwandlung

Die implizite Typumwandlung wird automatisch vom Compiler durchgeführt. Der Compiler wertet den Ausdruck gemäß den in einem Ausdruck verwendeten Datentypen aus.

Der Compiler wertet die Ergebnisse immer in einem höheren Datentyp unter allen Datentypen aus, die im angegebenen Ausdruck verwendet werden.

Implizites Casting ist die Hauptursache für die Besonderheit der Integer-Division. Wenn bei der arithmetischen Division zwei Integer-Operanden verwendet werden, wird die Auswertung implizit in den Datentyp int konvertiert, wodurch der Dezimalteil des Ergebnisses abgeschnitten wird.

Wir können das Problem der ganzzahligen Division lösen, indem wir den Typ eines Divisionsoperanden durch einen Fließkommatyp ändern, wie im folgenden Code gezeigt:

#include <iostream>
using namespace std;

int main() {
  float a = 10.0 / 7;
  cout << "The answer after implicit typecasting is: " << a << endl;
}

Ausgang:

The answer after implicit typecasting is: 1.42857

Im obigen Beispiel ist der Zähler 10.0 der Float-Wert und der Nenner ein ganzzahliger Wert. Da der Float-Datentyp höher ist als der Integer-Datentyp, konvertiert der Compiler implizit den resultierenden Wert in den Float-Datentyp.

Es gibt ein paar andere Besonderheiten, die mit dem Divisionsoperator in C++ verbunden sind, wie Division by Zero Error und Division of Pointers, die die Geeks weiter untersuchen können.

Verwandter Artikel - C++ Math