2017-02-04 1 views
0

J'ai écrit un code simple:C++: cin dans une boucle while

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a, b; 
    while (cin >> a >> b)  //Note the cin inside while loop 
    { 
    cout << a << b << "\n"; 
    } 
} 

Nous savons que while fonctions de boucle que lorsque l'expression évalue true (1) ou false (0). Comment se fait-il que cin évalue true et false.

également comment en boucle en cours d'exécution quand je suis entrée un numéro et arrête quand je rentre quelque chose de non-chiffres? Comment évalue-t-il le vrai et le faux?

Répondre

1

Lorsque vous écrit cin >> a, vous utilisez réellement le std::istream::operator>>, selon la référence here, cet opérateur retourne une référence d'objet istream&, et a pris la variable de droite (de référence) comme argument. Voici comment vous pouvez l'enchaîner comme: cin >> a >> b.

Pour voir cette chaîne cin >> a >> b une autre façon, quand tomber en panne, il est ces deux étapes:

  • Première étape, cin >> a retourne une valeur intermédiaire, disons que c'est x. (Vous pouvez réellement essayer auto x = cin >> a.
  • Deuxième étape, vous faites (cin >> a) >> b, lorsque nous utilisons cette valeur intermédiaire x, on pourrait écrire comme x >> b.

Alors qu'est-ce que l'enfer est-ce x? x reste ici une même position que le cin, il est un objet de type istream&.

par conséquent, lorsque vous parlez de true ou false, vous parlez en fait de savoir si ce retour istream& référence, reportez-vous à un objet, que ce soit true ou false. Ce serait false quand la sortie standard attraperait un signe EOF (comme quand vous tapez Ctrl-C dans un système comme unix, ou quand vous avez lu à la fin d'un fichier).

Votre code, par conséquent, pourrait être étendu en

#include <iostream> 
using namespace std; 
int main() 
{ 
    int a, b; 
    auto x = cin >> a >> b 
    while (x) 
    { 
    cout << a << b << "\n"; 
    } 
} 

Si vous utilisez un IDE comme Visual Studio, vous pouvez pointer votre souris à la x variable, il vous demande alors le type de x et ce serait un istream&.

En outre, grâce à Bob__, cette classe istream& pourrait être convertir à une classe ios::operator bool, comme il est écrit here, que ce soit true ou false représente l'état (ios_base::iostate) de cette stream, il therfore,

permet d'utiliser des flux et des fonctions qui renvoient des références à des flux en tant que conditions de boucle, ce qui entraîne les boucles d'entrée C++ idiomatiques telles que while(stream >> value) {...} ou while(getline(stream, string)){...}. De telles boucles n'exécutent le corps de la boucle que si l'opération d'entrée a réussi.

Pour faciliter votre compréhension, vous devriez lire le chapitre opérateur (surcharge) de votre manuel.

+1

Vous devriez également mentionner [operator bool] (http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool). –

+0

@Chazeon: La réponse mise à jour est vraiment explicative. Merci. :) – aps120797