Imprimir valores booleanos en C++
- Valor booleano como verdadero/falso en C++
-
Modifique el
printf()
agregando una declaración ternaria para imprimir valores booleanos en C++ -
Utilice
std::boolalpha
encout
para imprimir valores booleanos en C++ -
Use la faceta personalizada para
std::numpunc
para imprimir valores booleanos en C++ - Conclusión
Cuando intentamos imprimir valores booleanos en C++, se imprimen como 0
o 1
por std::cout
, pero a veces es mejor ver la salida en forma de true
o false
. Este artículo aborda cómo imprimir valores booleanos en forma textual en C++.
Valor booleano como verdadero/falso en C++
Supongamos un escenario en el que leemos líneas y líneas de código y archivos de registro durante la depuración, y ahora es muy fácil pasar por alto un 0
o un 1
en medio de un mar de errores y números. Por lo tanto, es mejor tener el valor booleano impreso como true/false
.
Veremos tres formas diferentes de conseguirlo.
Modifique el printf()
agregando una declaración ternaria para imprimir valores booleanos en C++
La forma más sencilla es hacer una ligera modificación en printf()
puede imprimir true
o false
. Al imprimir bool usando printf()
, tenemos que usar el formato como %d
ya que no hay un parámetro específico para los valores bool.
Dado que bool es más corto que int
, se promociona a int
cuando se pasa en la instrucción printf()
. Pero esto imprime el viejo 0
y 1
, así que modificamos añadiendo la sentencia ternaria if
y cambiando el especificador de formato a %s
, y obtenemos nuestro deseado true
o false
en La salida.
Código de ejemplo:
#include <iostream>
using namespace std;
int main() {
printf("boolean true: %d\n", true);
printf("boolean false: %d\n", false);
// modified printf()
printf("boolean true: %s\n", true ? "true" : "false");
printf("boolean false: %s\n", false ? "true" : "false");
}
Producción :
boolean true: 1
boolean false: 0
boolean true: true
boolean false: false
El problema con este método es que cuando los archivos de código fuente se vuelven grandes y complejos, dificulta la legibilidad.
Utilice std::boolalpha
en cout
para imprimir valores booleanos en C++
std::boolalpha
se puede encontrar en el archivo de encabezado <iomanip>
, y funciona con las funciones de flujo de entrada y salida. Los flujos estándar tienen un indicador boolalpha
que determina lo que se imprime en la pantalla.
Si se establece como true
, muestra la forma textual de los valores booleanos, es decir, true
o false
, pero cuando se establece como false
, obtenemos la salida bool como 0
y 1
solamente.
Ejemplo:
#include <iostream>
using namespace std;
int main() {
cout << "when boolalpha flag is off\n";
cout << "true: " << true << endl;
cout << "false: " << false << endl;
cout << "when boolalpha flag is on\n";
cout << boolalpha << "true: " << true << endl;
cout << boolalpha << "false: " << false << endl;
cout << noboolalpha;
}
Producción :
when boolalpha flag is off
true: 1
false: 0
when boolalpha flag is on
true: true
false: false
std::boolalpha
es una de las mejores formas de imprimir true
o false
como salida, pero tiene algunos inconvenientes. Primero, debemos desactivar el indicador boolalpha
después de usarlo a través de std::noboolalpha
.
Otro problema es qué pasa si queremos codificar en japonés o en algún otro idioma, y queremos que se imprima "hai"
(verdadero en japonés) o "nai"
(falso en japonés) en lugar de true
o false
. o si queremos poner las palabras en mayúsculas como True
o False
, no podemos hacer nada de esto usando solo std::boolalpha
.
Use la faceta personalizada para std::numpunc
para imprimir valores booleanos en C++
Como se mencionó en el párrafo anterior, ¿qué pasa si queremos imprimir algo que no sea true
o false
o una salida en mayúscula o localizada? Esto se puede hacer usando una faceta
personalizada para std::numpunct
.
Un facet
es una clase que describe el conjunto de características de localización asociado a un aspecto cultural específico. Las operaciones de entrada y salida del flujo utilizan std::numpunct
a través de std::numget
y std::numput
para analizar la entrada numérica y formatear la salida numérica.
El facet
para std::numpunct
encapsula las preferencias de puntuación numérica. Podemos especificar nuestras propias cadenas que queremos devolver cuando se activa la bandera std::boolalpha
anulando las funciones do_truename()
y do_falsename()
presentes en std::numpunct
.
Después de esto, con el objeto std::locale
junto con el uso de std::cout.imbue()
podemos reemplazar la configuración regional actual.
Código de ejemplo:
#include <ios>
#include <iostream>
#include <locale>
using namespace std;
class japanese_bool : public std::numpunct<char> {
protected:
std::string do_truename() const override { return "Hai"; }
std::string do_falsename() const override { return "NAI"; }
};
int main() {
cout.imbue(std::locale(std::locale(), new japanese_bool));
cout << std::boolalpha;
cout << "Japanese true : " << true << "\n";
cout << "Japanese false : " << false << "\n";
cout << noboolalpha;
}
En el código anterior, new
no es una pérdida de memoria, el objeto japanese_bool
se cuenta implícitamente como referencia, y cuando la referencia std::locale
queda fuera del alcance, se destruirá automáticamente.
Producción :
Japanese true : Hai
Japanese false : NAI
Conclusión
Este artículo nos ha enseñado diferentes métodos para imprimir la salida bool como true
y false
. Los dos primeros métodos son preferibles si queremos que la salida sea true
o false
, mientras que el tercer método es preferible cuando queremos alguna salida especializada en lugar de sólo true o false.