2017-11-18 5 views
2

Hier ist eine überladene >> Operatorfunktion:Was bedeutet wenn (! (Ist >> s))?

std::istream& operator>>(std::istream& is, std::vector<int>& v){ 
    string s; 
    if (! (is >> s)) 
    return is; 
    ... 
    return is; 
} 

Zu meinem Verständnis, machen if(! (is >> s)) keinen Sinn, weil das Terminal oder Konsole warten, bis die Eingabe von Tastaturen oder anderen Quellen s eingeben. Der Wert der Bedingung in if() wird letztendlich false sein. Wer kann helfen?

+0

Es muss gelesen werden als "Wenn' ist' kann eine Zeichenfolge nicht lesen ". –

+0

Dieser Code ist zu dicht. Es sollte in zwei Teilen geschrieben werden: 'is >> s; wenn (! ist) ... '. –

Antwort

3

Die is >> s versucht, die Zeichenfolge s aus dem Stream is zu lesen.

istream s operator>>() gibt eine Referenz auf is zurück.

istream s operator!() testet, ob der Stream in einem ungültigen Zustand ist. Insbesondere gibt es true zurück, wenn der badbit oder failbit des Streams festgelegt wurde.

So

if (! (is >> s)) 
    return is; 

ist funktionell äquivalent zu

is >> s; 
if (is.fail()) return is; // is.fail() returns true if failbit or badbit are set 

was bedeutet, dass die Funktion sofort zurück, wenn eine Zeichenkette liest aus dem Strom ausfällt. Beachten Sie, dass dies nicht das Ende des Streams ist.

+0

Ich dünn dieser Beitrag ist erschöpfend, aber andere sind auch informativ für mich, Danke! :) – Finley

2

istream muss keine Konsole sein. Es kann ein Stringstream sein. Und außerdem wird der "Warte auf Benutzereingabe" vom Anwendungscode nicht gesehen. Es schläft, während der Eingabestrom gefüllt wird (vom Betriebssystem, der darunterliegenden Bibliothek, ...)

Jedenfalls: Falls der Eingabedatenstrom überhaupt keine Daten enthält, ist diese Bedingung erfüllt.

std::string s; // empty! 
std::stringstream ss(s); 

std::vector<std::string> strings; 
ss >> strings; // should be empty! 
-1

Sie viele Dinge in einer Zeile

! (is >> s) 

Sie tun, nehmen Sie die Eingabestrom und es verwenden, um das Objekt s zuweisen, bewerten die teh Ergebnis s in der, wenn die Bedingung

1

zu versteh was if (!(is >> s)) bedeutet, dass Sie verstehen müssen, was if (is >> s) bedeutet.

Seit is ist ein std::istream, Operator >> ein std::istream zurückgibt. Daher ist is >> s ein std::istream, der innerhalb eines if einen logischen Wert true oder false produzieren muss. This Q&A erklärt, wie es in verschiedenen Versionen von C++ gemacht wird. Im Wesentlichen wird std::istream zu einer wahren Bedingung ausgewertet, wenn die Operation erfolgreich ist. Jetzt

, dass Sie die Bedeutung von is >> s kennen, können Sie herausfinden, dass eine Negation fügt hinzu, dass Sinn Flips: !(is >> s) nur wahr wären beim Lesen einer s von is nicht erfolgreich ist. Bei Strings bedeutet ein nicht erfolgreicher Lesevorgang, dass sich der Stream in einem ungültigen Zustand befindet, z. B. weil das Ende des Streams erreicht wurde.