J'imprime un bool
sur un flux de sortie comme celui-ci:
#include <iostream>
int main()
{
std::cout << false << std::endl;
}
La norme requiert-elle un résultat spécifique sur le flux (par exemple 0
pour false
)?
Les flux standard ont un indicateur boolalpha
qui détermine ce qui sera affiché - quand c'est faux, ils s'afficheront comme 0
et 1
. Quand c'est vrai, ils s'afficheront comme false
et true
.
Il y a aussi un std::boolalpha
manipulateur pour définir le drapeau, donc ceci:
#include <iostream>
#include <iomanip>
int main() {
std::cout<<false<<"\n";
std::cout << std::boolalpha;
std::cout<<false<<"\n";
return 0;
}
... produit une sortie comme:
0
false
Pour ce que ça vaut, le Word réel produit lorsque boolalpha
est défini sur true est localisé - c'est-à-dire <locale>
a un num_put
catégorie qui gère les conversions numériques, donc si vous imprégnez un flux des paramètres régionaux appropriés, il peut/imprimera true
et false
tels qu'ils sont représentés dans cet environnement local. Par exemple,
#include <iostream>
#include <iomanip>
#include <locale>
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"), il pourrait afficher faux
au lieu de false
. Je dois ajouter, cependant, que le véritable support pour cela est au mieux inégal - même la bibliothèque Dinkumware/Microsoft (généralement assez bonne à cet égard) affiche false
pour chaque langue que j'ai vérifiée.
Les noms utilisés sont définis dans une facette numpunct
, donc si vous voulez vraiment qu'ils s'impriment correctement pour une langue particulière, vous pouvez créer une facette numpunct
pour ce faire. Par exemple, celui qui (je crois) est au moins raisonnablement précis pour le français ressemblerait à ceci:
#include <array>
#include <string>
#include <locale>
#include <ios>
#include <iostream>
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 vous en doutez probablement):
0
faux
0 sera imprimé.
Comme en C++ true fait référence à 1 et false fait référence à 0 .
Dans le cas où vous souhaitez imprimer false au lieu de 0 , alors vous doivent définir l'indicateur de format boolalpha pour le flux str.
Lorsque l'indicateur de format boolalpha est défini, les valeurs bool sont insérées/extraites par leur représentation textuelle: true ou false, au lieu des valeurs intégrales.
#include <iostream>
int main()
{
std::cout << std::boolalpha << false << std::endl;
}
sortie :
false