Wat is het verschil tussen while(cin) en while(cin >> num)

Wat is het verschil tussen de volgende twee lussen en wanneer elke lus stopt?

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
    int x,y;
    while(cin >> x){
        // code
    }
    while(cin){
        cin >> y;
        //code
    }
    return 0;
}

Antwoord 1, autoriteit 100%

Laten we deze onafhankelijk bekijken:

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

Deze lus betekent intuïtief “lees waarden van cinin x, en zolang een waarde kan worden gelezen, ga door met herhalen.” Zodra een waarde wordt gelezen die geen intis, of zodra cinis gesloten, wordt de lus beëindigd. Dit betekent dat de lus alleen wordt uitgevoerd als xgeldig is.

Overweeg daarentegen deze lus:

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

De instructie while (cin)betekent “terwijl alle eerdere bewerkingen op cinzijn gelukt, doorgaan met herhalen.” Zodra we de lus binnengaan, proberen we een waarde in te lezen in y. Dit kan slagen, of het kan mislukken. Ongeacht welke het geval is, de lus blijft echter worden uitgevoerd. Dit betekent dat zodra ongeldige gegevens zijn ingevoerd of er geen gegevens meer kunnen worden gelezen, de lus nog een keer wordt uitgevoerd met de oude waarde van y, dus u hebt nog een herhaling van de lus dan nodig is .

U moet de eerste versie van deze lus zeker de voorkeur geven aan de tweede. Het voert nooit een iteratie uit, tenzij er geldige gegevens zijn.

Ik hoop dat dit helpt!


2, Autoriteit 10%

Het verschil is dat als cin >> whateverEvalueert naar False, uw tweede versie voert nog steeds de rest van de lus uit.

Laten we aannemen cin >> whateverfaalt. Wat gebeurt er?

while(cin >> x){
    // code that DOESN'T RUN
}
while(cin){
    cin >> y;
    //code that DOES RUN, even if the previous read failed
}

3, Autoriteit 10%

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

Dit leest gehele getallen totdat het een niet-gehele getal, EOF of een andere stroomfout tegenkomt. Wanneer u xin de lus gebruikt, weet u dat het met succes is gelezen.

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

Dit leest gehele getallen totdat het een niet-gehele getal, EOF of een andere stroomfout tegenkomt. De stroom wordt echter slechts gecontroleerd voordat het gehele getal leest. Wanneer u yin de lus gebruikt, kunt u niet garanderen dat deze met succes is gelezen.

Other episodes