2017-07-19 2 views
0

un code qui me semble redondant:Semble utilisation redondante de cin comme condition avec si, alors que je suis arrivé

char c; 
    cin>>c; 
    if(cin&&c=='n') 
    //do something 

Je ne comprends pas la valeur de l'introduction cin si, est-ce pas il aura toujours la valeur TRUE car je n'ai jamais rencontré de cas (dans mon expérience limitée) où cet objet istream n'est pas construit.

De même, j'ai vu cela aussi:

 if(cin) 

S'il vous plaît me corriger si je vais mal. Maintenant, les gens ne postez pas l'erreur en flux partiel comme je sais déjà, la majeure partie est quand est-ce un flux échoue en dehors de l'échec de ios_base :: Init

+1

http://www.cppreference.com/w/cpp/io/basic_ios/operator_bool –

+0

@MooingDuck Quand un flux peut-il rencontrer une erreur: pouvez-vous me donner des exemples, des liens? – Gaurav

+1

Gurav 'int x, cin >> x;' avec l'entrée utilisateur "FUBAR!", Qui ne peut pas être convertie en 'int'. C'est un peu plus difficile avec un "char". – user4581301

Répondre

4

std::cin est une instance de std::basic_istream<char>. Comme il est utilisé dans le contexte d'une condition, nous sommes intéressés par l'opérateur de conversion bool. De http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool:

de la documentation

std::basic_ios::operator bool

Returns true if the stream has no errors and is ready for I/O operations. Specifically, returns !fail()

, il est clair que if(cin) est destiné à vérifier si cin avait des erreurs. Plus précisément, il est dit "si cin n'a pas rencontré d'erreur lors de sa dernière opération".

La condition dans if(cin&&c=='n') suit le même principal, mais vérifie également que le flux d'entrée fourni n. En d'autres termes, "si cin n'a pas rencontré d'erreur et a retourné le caractère n".