web-dev-qa-db-fra.com

Quelle est la différence entre while (cin) et while (cin >> num)

Quelle est la différence entre les deux boucles suivantes et Quand chacune d’elles s’arrêtera?

#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;
}
13
Ahmed_Mohsen

Regardons ces indépendamment:

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

Cette boucle, de manière intuitive, signifie "conservez les valeurs de cin dans x et, tant qu’une valeur peut être lue, continuez à lire en boucle". Dès qu'une valeur lue n'est pas int ou dès que cin est fermé, la boucle se termine. Cela signifie que la boucle ne s'exécutera que tant que x sera valide.

D'autre part, considérons cette boucle:

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

L'instruction while (cin) signifie "tant que toutes les opérations précédentes sur cin ont réussi, continuez à boucler." Une fois que nous entrons dans la boucle, nous allons essayer de lire une valeur dans y. Cela pourrait réussir ou échouer. Cependant, quel que soit le cas, la boucle continuera à s'exécuter. Cela signifie qu'une fois que des données non valides ont été entrées ou qu'il n'y a plus de données à lire, la boucle s'exécutera une fois de plus en utilisant l'ancienne valeur de y. Vous aurez donc une itération supplémentaire de la boucle.

Vous devriez définitivement préférer la première version de cette boucle à la seconde. Il n'exécute jamais une itération s'il n'y a pas de données valides.

J'espère que cela t'aides!

18
templatetypedef

La différence est que si cin >> whatever est évalué à false, votre deuxième version exécute toujours le reste de la boucle.

Supposons que cin >> whatever échoue. Qu'est-ce qui va arriver?

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

while(cin){
    cin >> y;
    //code that DOES RUN, even if the previous read failed
}
3
Luchian Grigore
while(cin >> x){
    // code
}

Cela lit les entiers jusqu'à ce qu'il rencontre une erreur non-entière, EOF ou autre erreur de flux. Chaque fois que vous utilisez x dans la boucle, vous savez que celle-ci a été lue avec succès.

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

Cela lit les entiers jusqu'à ce qu'il rencontre une erreur non-entière, EOF ou autre erreur de flux. Cependant, le flux est uniquement vérifié avant en lisant le nombre entier. Lorsque vous utilisez y dans la boucle, vous ne pouvez pas garantir qu'elle a été lue avec succès.

2
paddy

cin >> x va stocker la valeur d'entrée dans x.

En ce qui concerne while(cin), std::cin renverra un booléen indiquant si un indicateur d'erreur est défini ou non. Par conséquent, vous continuerez dans la boucle while tant que std::cin n'a pas d'indicateur d'erreur défini en interne. Un indicateur d'erreur peut être défini s'il trouve un caractère end of file ou s'il n'a pas réussi à lire et à stocker la valeur.

0
Caesar