2017-03-27 3 views
2

Je faisais un exercice pour une classe et j'ai décidé de voir ce qui se passerait si je tapais char alors que le code attendait un int. Je mets dans la lettre 'g' juste pour voir ce qui se passerait ... il sort -858993460 et je ne sais pas pourquoi.Pourquoi la lecture de char 'g' dans un int produit le numéro -858993460 dans ce code?

Voici le code:

#include <iostream> 
#include <iomanip> 
#include <string>  
using namespace std; 

int main() 
{ 
int test; 

cout << "Please enter a even integer or a odd integer. " << endl; 

cin >> test; 
cout << test; //here is where i got the -858993460 



if (test % 2) 
{cout << "TRIANGLE" << endl;} 
else 
{cout << "SQUARE" << endl;} 



return 0; 

} 

Alors, où est-ce que -858993460 vient?

+0

-858993460 est 0xcccccccc en hexadécimal. Cela signifie que 'int' n'est pas initialisé en mode de débogage Visual Studio. – Marco167

Répondre

3

Le comportement de std::basic_istream::operator>> est passé de C++ 11. Avant C++ 11,

Si l'extraction échoue (par exemple, si une lettre a été entrée à l'endroit où un chiffre est attendu), la valeur est laissée inchangée et la valeur d'échec est définie.

Cela semble être le cas. test n'est pas initialisé; alors vous avez une valeur aléatoire imprimée. Notez que c'est un comportement indéfini en fait.

Et depuis C++ 11,

En cas d'échec d'extraction, zéro est écrit à la valeur et failbit est réglée.

Cela signifie que vous obtiendrez la valeur 0 après C++ 11.

+0

Oh! ok, donc, -858993460 une valeur par défaut \ random et rien n'a été assigné à 'test'. c'est logique! Merci beaucoup! –

0

Si vous vérifiez le résultat de la lecture, vous verrez que rien n'a été lu.

if (cin >> test) { 
    cout << "read " << test << endl; 
} 
else { 
    cout << "read failed" << endl; 
} 

La valeur que vous avez l'impression est de valeur non initialisée test. Cela peut changer d'une course à l'autre. Techniquement, l'impression est un comportement indéfini, donc votre programme pourrait même tomber en panne, bien que cela ne se produise probablement pas dans la pratique.