2015-07-28 10 views
6

Seguo il primer libro C++, e sono incuriosito circa il seguente esempio di codice:La seconda condizione in (cin >> buf &&! Buf.empty()) è ridondante?

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

il ciclo deve ignorare le parole che non iniziano con un underscore e fare qualcosa con quelli che iniziano con un carattere di sottolineatura .

La mia domanda riguarda la condizione

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

direi che la condizione (! Buf.empty()) è sempre vero quando (cin >> BUF) è vero, quindi non vedo il punto di aggiungerlo. C'è qualche caso quando la seconda condizione non è ridondante?

C'è una domanda precedente sullo stack overflow su una costruzione simile (Is it possible to read an empty string from cin and still get true from cin.good()?) la cui risposta è semplicemente no (la seconda condizione è ridondante).

Se questo è corretto, perché è sul libro? È semplicemente un errore? Oppure c'è qualche situazione particolare in cui la doppia condizione ha senso?

+1

Ebbene secondo la domanda si è collegato , la seconda condizione è ridondante. In realtà, la tua domanda sembra quasi un duplicato di quello. –

+0

È molto strano essere nel libro allora. Sembra che ci sia qualche situazione speciale in cui questa costruzione è utile. –

+1

Questa condizione non è necessaria affatto. Il tuo autore si sbaglia sulle condizioni di errore di 'std :: operator >> (std :: istream &, std :: string &)'. – 0x499602D2

risposta

1

solo per essere chiari, l'operatore bool() è badbit || failbit, e il failbit viene impostato quando "un'operazione di ingresso non è riuscito a leggere il charchter previsto o qualsiasi altro tipo di operazione non è riuscito a produrre il risultato desiderato" (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 . . . 
}