Imprimir valores booleanos en C++

Suraj P 12 octubre 2023
  1. Valor booleano como verdadero/falso en C++
  2. Modifique el printf() agregando una declaración ternaria para imprimir valores booleanos en C++
  3. Utilice std::boolalpha en cout para imprimir valores booleanos en C++
  4. Use la faceta personalizada para std::numpunc para imprimir valores booleanos en C++
  5. Conclusión
Imprimir valores booleanos en C++

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.

Autor: Suraj P
Suraj P avatar Suraj P avatar

A technophile and a Big Data developer by passion. Loves developing advance C++ and Java applications in free time works as SME at Chegg where I help students with there doubts and assignments in the field of Computer Science.

LinkedIn GitHub