2015-07-28 4 views
6

Ich bin nach dem C++ Primer Buch und wurde neugierig zu folgendem Codebeispiel:Ist die zweite Bedingung in (cin >> buf &&! Buf.empty()) redundant?

string buf; 
while (cin >> buf && !buf.empty()) { 
    if (buf[0] != '_') 
     continue; // get another input 
     //the input starts with an underscore; process buf . . . 
} 

Die Schleife Wörter ignorieren soll, die mit denen etwas nicht mit einem Unterstrich beginnen und tun, die mit einem Unterstrich beginnen Sie .

Meine Frage ist über den Zustand

(cin >> buf && !buf.empty()) 

würde ich sagen, dass die Bedingung (! Buf.empty()) ist immer wahr, wenn (cin >> buf) wahr ist, so nicht sehen, ich die Punkt des Hinzufügens. Gibt es einen Fall, in dem die zweite Bedingung nicht redundant ist?

Es gibt eine vorherige Frage über Stapelüberlauf über eine ähnliche Konstruktion (Is it possible to read an empty string from cin and still get true from cin.good()?), deren Antwort ist einfach nein (die zweite Bedingung ist redundant).

Wenn das stimmt, warum ist es auf dem Buch? Es ist einfach ein Fehler? Oder gibt es eine spezielle Situation, in der die doppelte Bedingung sinnvoll ist?

+1

Nun nach der Frage, die Sie verknüpfen , die zweite Bedingung ist redundant. In der Tat scheint Ihre Frage fast wie ein Duplikat zu sein. –

+0

Es ist sehr seltsam, dann im Buch zu sein. Es scheint, dass es eine spezielle Situation gibt, in der diese Konstruktion nützlich ist. –

+1

Diese Bedingung wird überhaupt nicht benötigt. Ihr Autor irrt sich über die Fehlerbedingungen von 'std :: operator '(std :: isotream &, std :: string &)'. – 0x499602D2

Antwort

1

nur um klar zu sein, operator bool() ist badbit || failbit und die failbit gesetzt wird, wenn „ein Eingabevorgang der erwarteten charchter oder jede andere Art von Operation zu lesen, ist fehlgeschlagen konnten das gewünschte Ergebnis erzielen“ (Langer, Kreft 1999)

string buf; 
while ((cin >> buf,cin.operator bool()) && !buf.empty()) { 
    if (buf[0] != '_') 
     continue; // get another input 
     //the input starts with an underscore; process buf . . . 
}