Heim > Backend-Entwicklung > C++ > Warum unterscheidet sich die Fehlerbehandlung von C Stringstream vor und nach C 11?

Warum unterscheidet sich die Fehlerbehandlung von C Stringstream vor und nach C 11?

Mary-Kate Olsen
Freigeben: 2024-11-25 02:23:29
Original
196 Leute haben es durchsucht

Why Does C   Stringstream's Failure Handling Differ Before and After C  11?

Auswirkungen der Fehlerbehandlung auf den Zielwert mit Stringstream

In C-Streams unterscheidet sich das Verhalten der Fehlerbehandlung je nach Stream-Typ und Sprachversion. Diese Diskrepanz wird durch das unerwartete Verhalten veranschaulicht, das beim Einlesen eines Worts in eine Ganzzahlvariable mithilfe von Stringstream beobachtet wird.

Traditionell, wie in Stroustrups TC PL (3. Auflage) angegeben, sollte die Zielvariable bestehen bleiben, wenn eine Eingabeoperation fehlschlägt bei bestimmten Datentypen unverändert. Wenn jedoch eine Typinkongruenz im Stringstream auftritt, wird der Wert der Variablen geändert, was im Widerspruch zum zitierten Zitat steht.

C 11-Änderung

Der Grund für diese Diskrepanz liegt in der in C 11 implementierten Änderung. Vor C 11 verwendete Stringstream eine Analyse im Scanf-Stil, um Zahlen zu extrahieren. In C 11 wurde diese Methode durch Aufruffunktionen wie std::strtoll ersetzt, die das Ziel im Falle eines Fehlers ändern.

Die Änderung der Parsing-Strategie führte folglich zu einem anderen Fehlerverhalten. Vor C 11 blieb das Ziel unverändert, während in C 11 und später das Ziel bei einem Fehler auf Null gesetzt wird.

Verifizierung und Analyse

Um diese Theorie zu überprüfen, konsultieren Sie eine Referenz wie z die in der Antwort angegebene. In dieser Referenz wird erläutert, dass vor C 11 ein Fehler bei der Extraktion dazu führte, dass der Wert unverändert blieb und das Failbit gesetzt wurde. Ab C 11 führt ein Fehler jedoch dazu, dass für das Ziel ein Nullwert und das Failbit gesetzt wird.

Darüber hinaus heißt es in der Referenz, dass der Eingabeoperator auf der Lokalisierungsfacette num_get basiert, die die Funktion do_get nutzt . In C 11 wurde do_get geändert, um std::strtoll und ähnliche Funktionen zu verwenden, was zu der beobachteten Verhaltensänderung führte.

Das obige ist der detaillierte Inhalt vonWarum unterscheidet sich die Fehlerbehandlung von C Stringstream vor und nach C 11?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage