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;
}
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!
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
}
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.
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.