Heim > Backend-Entwicklung > C++ > Warum setzt „stringstream >>' meine Variable bei einem Extraktionsfehler in C 11 auf Null?

Warum setzt „stringstream >>' meine Variable bei einem Extraktionsfehler in C 11 auf Null?

Patricia Arquette
Freigeben: 2024-11-26 12:57:11
Original
647 Leute haben es durchsucht

Why Does `stringstream >>` Meine Variable bei Extraktionsfehler in C 11 auf Null setzen?
>` Meine Variable bei Extraktionsfehler in C 11 auf Null setzen? " />

Warum ändert Stringstream >> den Wert des Ziels bei einem Fehler?

In modernem C (ab C 11) ist das Verhalten von >> ;-Operator für Stringstream, wenn eine Extraktion fehlschlägt. Gemäß dem C 11-Standard wird die Zielvariable bei einem Fehler auf einen Standardwert gesetzt (normalerweise Null). Ganzzahlen) und das Failbit-Flag ist gesetzt.

Vor C 11 war das Verhalten anders, laut Stroustrups Zitat aus „TC PL, 3rd Edition“, sollte die Zielvariable jedoch unverändert bleiben Das bereitgestellte Codebeispiel zeigt einen Widerspruch, bei dem die Zielvariable v nach einem fehlgeschlagenen Extraktionsversuch auf Null gesetzt wird.

Dieses scheinbar widersprüchliche Verhalten kann durch die Tatsache erklärt werden, dass die Das Snippet wird im C 11-Modus kompiliert, wodurch sich das Verhalten des >>-Operators wie folgt ändert:

  • Wenn die Extraktion aufgrund eines ungültigen Datentyps fehlschlägt (z. B. beim Versuch, ein Wort einzulesen). eine Ganzzahl), die Zielvariable bleibt unverändert und das Failbit-Flag ist gesetzt.
  • Wenn die Extraktion fehlschlägt, weil der Wert für den Zieltyp zu groß oder zu klein ist, wird die Der maximal oder minimal mögliche Wert (z. B. std::numeric_limits::max() für Ganzzahlen) wird in die Variable geschrieben und das Failbit-Flag wird gesetzt.

Im Beispielcode enthält der Stringstream Eine Zeichenfolge, die nicht in eine Ganzzahl konvertiert werden kann, was zu einem Analysefehler führt. Im C 11-Modus führt dieser Fehler dazu, dass v auf 0 gesetzt wird, wie in der Ausgabe beobachtet. Das Failbit-Flag ist ebenfalls gesetzt, wie durch die Meldung „state: failbit“ angezeigt.

Diese Verhaltensänderung wurde mit C 11 eingeführt, um eine konsistente Behandlung von Extraktionsfehlern für Stream-Extraktoren sicherzustellen. Es steht im Einklang mit dem allgemeinen Prinzip, dass Stream-Extraktoren die Zielvariable im Falle eines Fehlers (wenn möglich) nicht ändern sollten.

Das obige ist der detaillierte Inhalt vonWarum setzt „stringstream >>' meine Variable bei einem Extraktionsfehler in C 11 auf Null?. 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