Typumwandlungen und static_cast
Eine Konvertierung überführt einen Wert in einen anderen Typ. Implizit bedeutet automatisch durch die Sprache veranlasst. Explizit bedeutet ausdrücklich angegeben. Nicht jede erlaubte Umwandlung ist für deine Aufgabe sinnvoll.
Typumwandlungen und static_cast#
Werte und Ausdrücke · Lektion 16 von 60
Voraussetzungen: Operatoren. Lernziel: Du wandelst Werte bewusst um und prüfst mögliche Verluste vorher.
Eine Konvertierung überführt einen Wert in einen anderen Typ. Implizit bedeutet automatisch durch die Sprache veranlasst. Explizit bedeutet ausdrücklich angegeben. Nicht jede erlaubte Umwandlung ist für deine Aufgabe sinnvoll.
1#include <iostream>2 3int main() {4 const int summe{7};5 const int anzahl{2};6 const double mittel = static_cast<double>(summe) / anzahl;7 std::cout << mittel << '\n';8}static_cast<double>(summe) erzeugt einen double-Wert. summe bleibt ein int. Weil die Division jetzt einen Gleitkommaoperanden hat, wird passend mit Gleitkommazahlen gerechnet. Cast ist der englische Ausdruck für eine ausdrücklich angegebene Umwandlung.
Ein Cast ist keine Sicherheitsprüfung#
static_cast<int>(3.9) schneidet den Bruchteil ab und ergibt 3. Es rundet nicht auf 4. Ist der abgeschnittene Gleitkommawert im Zieltyp nicht darstellbar, ist die Umwandlung undefiniertes Verhalten. Nicht endliche Werte musst du ebenfalls ausschließen. Endlich bedeutet weder unendlich noch „keine Zahl“, auch NaN genannt.
Prüfe vor einer Umwandlung externer Daten die Fachgrenzen. Ein bewusst begrenzter Bereich wie 0 bis 100 erleichtert diese Prüfung. Ein Cast ersetzt keine Validierung, also Prüfung auf zulässige Werte.
1// Absichtlich falsch: Informationsverlust wird abgelehnt.2int stueckzahl{3.9};Die Initialisierung mit {} lehnt diese Verengung ab. int stueckzahl = 3.9; kann dagegen mit Warnung übersetzt werden und Nachkommastellen verlieren. Kläre zuerst, ob das Fachproblem überhaupt eine ganze Stückzahl verlangt.
Signed und unsigned#
Containergrößen verwenden häufig std::size_t, einen vorzeichenlosen Typ für Größen. Ein Vergleich mit einer negativen int-Zahl kann überraschen: Gemeinsame Rechenregeln können eine Umwandlung zum vorzeichenlosen Typ auslösen.
Prüfe negative Eingaben, bevor du sie als Größe verwendest. comparison of integer expressions of different signedness weist auf diese Mischung hin. Ein zusätzlicher Cast ohne Bereichsprüfung verschiebt das Problem nur.
Text ist ein eigener Fall#
static_cast<int>("42") ist keine Text-zu-Zahl-Konvertierung. Parsen heißt, Text nach Regeln zu interpretieren. Dafür gibt es Eingabestreams oder std::from_chars aus <charconv>. Bei from_chars musst du Fehlercode und Endzeiger prüfen, wenn der komplette Text eine Zahl sein soll. Der Endzeiger markiert die Stelle, bis zu der gelesen wurde.
Übung#
Was liefert ein Kommaergebnis: static_cast<double>(7 / 2) oder static_cast<double>(7) / 2?
Lösung
Die zweite Rechnung ergibt 3,5. Im ersten Ausdruck ist die Ganzzahldivision schon vor der Umwandlung abgeschlossen.
Weiterlernen#
Zurück: Rechnen, vergleichen und logische Ausdrücke · Kursübersicht · Weiter: Texte mit std::string verarbeiten
Kommentare 0
Kommentare sind für diese Seite deaktiviert.