2015-07-28 30 views
6

śledzę C++ książkę startera i dostał ciekawi poniższym przykładzie kodu:Czy drugi warunek w (cin >> buf &&! Buf.empty()) jest nadmiarowy?

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

Pętla powinna ignorować słów, które nie zaczynają się od znaku podkreślenia i coś zrobić z tymi, które mają rozpocząć się od podkreślenia .

Moje pytanie jest o kondycji

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

Powiedziałbym, że warunek (! Buf.empty()) jest zawsze prawdziwe, gdy (cin >> buf) jest prawdziwe, więc nie widzę punkt dodania. Czy jest jakiś przypadek, gdy drugi warunek nie jest zbędny?

Istnieje poprzednie pytanie dotyczące przepełnienia stosu o podobnej konstrukcji (Is it possible to read an empty string from cin and still get true from cin.good()?), którego odpowiedź jest po prostu nie (drugi warunek: jest nadmiarowy).

Jeśli tak, dlaczego jest w książce? To po prostu błąd? Czy jest jakaś wyjątkowa sytuacja, w której podwójny warunek ma sens?

+1

Dobrze zgodnie z pytaniem jesteś powiązany drugi warunek jest zbędny. W rzeczywistości twoje pytanie prawie wydaje się duplikatem tego. –

+0

To jest bardzo dziwne być w tej książce. Wydaje się, że istnieje pewna szczególna sytuacja, w której ta konstrukcja jest przydatna. –

+1

Ten warunek nie jest w ogóle potrzebny. Twój autor myli się co do warunków awarii 'std :: operator >> (std :: istream &, std :: string &)'. – 0x499602D2

Odpowiedz

1

dla jasności, operator bool() jest błędny || failbit i failbit jest ustawiony podczas „operacji wejścia udało się odczytać spodziewany charchter lub innego rodzaju działania nie przyniosły pożądanego rezultatu” (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 . . . 
}