103 votes

C++ impression booléen, quel est affiché?

J'imprime un booléen dans un flux de sortie de cette manière :

#include 

int main()
{
    std::cout << false << std::endl;
}

Est-ce que la norme exige un résultat spécifique sur le flux (par exemple, 0 pour false) ?

185voto

Jerry Coffin Points 237758

Les flux standards ont un indicateur boolalpha qui détermine ce qui est affiché -- quand il est faux, ils s'affichent en tant que 0 et 1. Quand il est vrai, ils s'affichent en tant que false et true.

Il y a aussi un manipulateur std::boolalpha pour définir l'indicateur, donc ceci :

#include 
#include 

int main() {
    std::cout<

``...produit une sortie comme suit :

0
false

En ce qui concerne la localisation, le mot réel produit lorsque boolalpha est défini sur true est localisé -- c'est-à-dire que a une catégorie num_put qui gère les conversions numériques. Ainsi, si vous imbuez un flux avec la bonne localisation, il peut/va imprimer true et false tels qu'ils sont représentés dans cette localisation. Par exemple,

#include 
#include 
#include 

int main() {
    std::cout.imbue(std::locale("fr"));

    std::cout << false << "\n";
    std::cout << std::boolalpha;
    std::cout << false << "\n";
    return 0;
}

...et au moins en théorie (en supposant que votre compilateur/bibliothèque standard accepte "fr" comme identifiant pour "français") cela pourrait imprimer faux au lieu de false. Je dois ajouté cependant que le support réel pour cela est inégal au mieux - même la bibliothèque Dinkumware/Microsoft (habituellement assez bonne à cet égard) imprime false pour chaque langue que j'ai vérifiée.

Les noms utilisés sont définis dans une facette numpunct cependant, donc si vous voulez vraiment qu'ils s'impriment correctement pour une langue particulière, vous pouvez créer une facette numpunct pour cela. Par exemple, une qui (je crois) est au moins raisonnablement précise pour le français ressemblerait à ceci :

#include 
#include 
#include 
#include 
#include 

class my_fr : public std::numpunct< char > {
protected:
    char do_decimal_point() const { return ','; }
    char do_thousands_sep() const { return '.'; }
    std::string do_grouping() const { return "\3"; }
    std::string do_truename() const { return "vrai";  }
    std::string do_falsename() const { return "faux"; }
};

int main() {
    std::cout.imbue(std::locale(std::locale(), new my_fr));

    std::cout << false << "\n";
    std::cout << std::boolalpha;
    std::cout << false << "\n";
    return 0;
}

Et le résultat est (comme vous pourriez vous y attendre) :

0
faux``

37voto

ritesh_NITW Points 2696

0 sera imprimé.

Comme en C++ true se réfère à 1 et false se réfère à 0.

Dans le cas où vous voulez imprimer false au lieu de 0, vous devez définir le drapeau de format boolalpha pour le flux str.

Lorsque le drapeau de format boolalpha est défini, les valeurs booléennes sont insérées/extraites par leur représentation textuelle : soit true soit false, au lieu de valeurs intégrales.

#include 
int main()
{
  std::cout << std::boolalpha << false << std::endl;
}

output:

false

IDEONE

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X