2013-10-20 16 views

risposta

12

Diamo un'occhiata a questi in modo indipendente:

while(cin >> x) { 
    // code 
} 

Questo ciclo, intuitivamente, significa "mantenere i valori di lettura da cin in x, e finché un valore può essere letto, continuare il ciclo." Non appena viene letto un valore che non è un int o non appena cin viene chiuso, il ciclo termina. Ciò significa che il ciclo verrà eseguito solo mentre x è valido.

D'altra parte, prendere in considerazione questo ciclo:

while(cin){ 
    cin >> y; 
    //code 
} 

La dichiarazione while (cin) mezzo "mentre tutte le operazioni precedenti sul cin sono riusciti, continuare a ciclo." Una volta entrato nel ciclo, proveremo a leggere un valore in . Questo potrebbe riuscire, o potrebbe fallire. Tuttavia, indipendentemente da quale sia il caso, il ciclo continuerà ad essere eseguito. Ciò significa che una volta immessi dati non validi o non ci sono più dati da leggere, il ciclo verrà eseguito ancora una volta utilizzando il vecchio valore di , in modo da avere un'ulteriore iterazione del ciclo del necessario.

Si consiglia di preferire la prima versione di questo ciclo al secondo. Non esegue mai un'iterazione a meno che non ci siano dati validi.

Spero che questo aiuti!

+0

"e finché un valore può essere letto, continua il ciclo" vale a dire se la lettura ha avuto esito positivo, eseguire il corpo del loop. – dyp

3

La differenza è che se cin >> whatever restituisce false, la tua seconda versione corre ancora il resto del ciclo.

Supponiamo che cin >> whatever non riesca. Cosa accadrà?

while(cin >> x){ 
    // code that DOESN'T RUN 
} 

while(cin){ 
    cin >> y; 
    //code that DOES RUN, even if the previous read failed 
} 
+0

Io non la penso così come l'ho usato nel giudice online e il risultato era una risposta sbagliata non al limite di tempo! –

0

cin >> x memorizzerà il valore di input in x.

Come per while(cin), std::cin restituirà un valore booleano sul fatto che sia impostato un flag di errore. Pertanto, continuerai nel ciclo while fintanto che std::cin non ha alcun flag di errore impostato internamente. È possibile impostare un flag di errore se trova un carattere end of file o se non è riuscito a leggere e memorizzare nel valore.

1
while(cin >> x){ 
    // code 
} 

Questa legge interi finché non incontra un non intero, EOF, o altro errore flusso. Ogni volta che si utilizza x all'interno del ciclo, si sa che è stato letto correttamente.

while(cin){ 
    cin >> y; 
    //code 
} 

Questa legge interi finché non incontra un non intero, EOF, o altro errore flusso. Tuttavia, lo stream viene controllato solo prima dello leggendo il numero intero. Quando si utilizza y nel ciclo, non è possibile garantire che sia stato letto correttamente.

Problemi correlati