2009-02-10 13 views
1

Quel est l'ensemble des sorties valides pour ce qui suit, selon la norme?Quelles sont les valeurs valides de l'expression (uninitialized_bool? 1: 2)?

bool x; 
cout << (x ? 1 : 2); 

modifier: inconnu (google) a obtenu. En gcc mon code était en panne à cause de sprite.setFrame(isPressed ? 0 : 1) avec le retour conditionnel 28!

+0

C'est une mauvaise pratique d'utiliser la variable non initialisée. Toutes les variables doivent être initialisées dès qu'elles sont déclarées. – Vinay

+0

Vous pourriez avoir essayé de confirmer vos soupçons avec un assert: bool x; assert (x == vrai || x == faux); cout << (x? 1: 2); –

+0

Pour 'isPressed? 0: 1', GCC peut simplement faire un 'isPressed^1' en interne. Donc 'isPressed' dans votre code avait probablement le bit-pattern représentant' 29' et l'opération '^ 1' de GCC en faisait un 28. –

Répondre

1

En utilisant une valeur bool de manière décrite par la présente norme comme « non défini » comme en examinant la valeur d'une variable automatique unitialisée, pourrait le faire se comporter comme il est ni vrai ou faux.

Bienvenue dans le monde du comportement indéfini. Mais d'abord, pourquoi voudriez-vous faire cela?

+0

ne vous inquiétez pas, je ne vais pas :) –

2

Si x n'est pas initialisé, il peut être vrai ou faux. Ainsi, les sorties valides sont 1 ou 2.

1

En utilisant une variable uninitialised est undefined.So tout peut arriver

+0

Comportement non défini ou juste une valeur indéfinie? Pouvez-vous citer la norme? –

+0

Je ne sais pas si c'est "indéfini" ou "non spécifié". S'il a une valeur "non spécifiée", alors il peut être vrai ou faux et ainsi vous pouvez obtenir 1 et 2. Si le comportement est "indéfini", alors oui n'importe quoi pourrait arriver. –

+0

Je veux dire, peut-être que la variable est exigée par la norme pour avoir une certaine valeur (_any_ value) appartenant, bien sûr, à son ensemble de valeurs possible. Vous pouvez donc créer un compilateur conforme à la norme C++ qui, après "int i; cout << i;", vous donne "88", mais pas un qui se bloque. –

1

Tout peut arriver, y compris fireTheMissiles().

Questions connexes