Pregunta Usar valores booleanos en C


C no tiene ningún tipo booleano incorporado. ¿Cuál es la mejor manera de usarlos en C?


526
2017-12-17 12:46


origen


Respuestas:


Opción 1

typedef int bool;
#define true 1
#define false 0

opcion 2

typedef int bool;
enum { false, true };

Opción 3

typedef enum { false, true } bool;

Opción 4 (C99)

#include <stdbool.h>

Explicación

  • Las opciones 1, 2 y 3 tendrán en la práctica el mismo comportamiento idéntico. # 2 y # 3 no usan #defines, que en mi opinión es mejor.
  • La opción 4 funcionará solo si usa C99 y es la "forma estándar" de hacerlo. Elija esto si es posible.

Si no está decidido, ¡vaya con el n. ° 3!


827
2017-12-17 12:49



Algunas reflexiones sobre booleanos en C:

Tengo edad suficiente para usar simplemente ints como mi tipo booleano sin ningún typedefs o special define o enums para valores verdaderos / falsos. Si sigues mi sugerencia a continuación sobre nunca comparar contra constantes booleanas, entonces solo necesitas usar 0/1 para inicializar las banderas de todos modos. Sin embargo, tal enfoque puede considerarse demasiado reaccionario en estos tiempos modernos. En ese caso, uno definitivamente debería usar <stdbool.h> ya que al menos tiene el beneficio de ser estandarizado.

Cualquiera que sea el nombre de las constantes booleanas, úselas solo para la inicialización. Nunca escribir algo como

if (ready == TRUE) ...
while (empty == FALSE) ...

Estos siempre pueden ser reemplazados por el más claro

if (ready) ...
while (!empty) ...

Tenga en cuenta que, de hecho, es razonable y comprensible que se lean en voz alta.

Dale a tus variables booleanas nombres positivos, es decir, full en lugar de notfull. Esto último conduce a un código que es difícil de leer fácilmente. Comparar

if (full) ...
if (!full) ...

con

if (!notfull) ...
if (notfull) ...

Los dos ex pares leen de forma natural, mientras !notfull es incómodo de leer incluso como es, y se vuelve mucho peor en expresiones booleanas más complejas.

Los argumentos booleanos generalmente deben evitarse. Considere una función definida así

void foo(bool option) { ... }

Dentro del cuerpo de la función, está muy claro lo que significa el argumento, ya que tiene un nombre conveniente, y con suerte significativo. Pero, los sitios de llamadas se ven como

foo(TRUE);
foo(FALSE):

Aquí, es esencialmente imposible saber qué significa el parámetro sin mirar siempre la definición o declaración de la función, y empeora mucho más si agrega aún más parámetros booleanos. Sugiero cualquiera

typedef enum { OPT_ON, OPT_OFF } foo_option;
void foo(foo_option option);

o

#define OPT_ON true
#define OPT_OFF false
void foo(bool option) { ... }

En cualquier caso, el sitio de llamadas ahora se ve como

foo(OPT_ON);
foo(OPT_OFF);

que el lector tiene al menos una oportunidad de entender sin dragar la definición de foo.


190
2017-12-18 04:55



Un booleano en C es un número entero: cero para falso y distinto de cero para verdadero.

Ver también Tipo de datos booleanos, sección C, C ++, Objective-C, AWK.


75
2017-12-17 12:49



Aquí está la versión que utilicé:

typedef enum { false = 0, true = !false } bool;

Porque falso solo tiene un valor, pero un verdadero lógico puede tener muchos valores, pero los conjuntos de técnica son verdaderos para ser lo que el compilador utilizará para lo contrario de falso.

Esto soluciona el problema de alguien que codifica algo que se reduciría a esto:

if (true == !false)

Creo que todos estaríamos de acuerdo en que no es una buena práctica, pero por el costo único de hacer "verdadero =! Falso" eliminamos ese problema.

[EDIT] Al final usé:

typedef enum { myfalse = 0, mytrue = !myfalse } mybool;

para evitar la colisión del nombre con otros esquemas que estaban definiendo truey false. Pero el concepto sigue siendo el mismo.

[EDITAR] Para mostrar la conversión de entero a booleano:

mybool somebool;
int someint = 5;
somebool = !!someint;

¡El primero (más correcto)! convierte el entero distinto de cero a un 0, luego el segundo (más a la izquierda)! convierte el 0 en a myfalse valor. Lo dejaré como ejercicio para que el lector convierta un entero cero.


60
2018-05-14 22:31



Si está utilizando un compilador C99, tiene soporte incorporado para los tipos bool:

#include <stdbool.h>
int main()
{
  bool b = false;
  b = true;
}

http://en.wikipedia.org/wiki/Boolean_data_type


35
2017-12-17 14:54



typedef enum {
    false = 0,
    true
} t_bool;

17
2017-12-17 12:51



C tiene un tipo booleano: bool (al menos durante los últimos 10 (!) años)

Incluir stdbool.hy verdadero / falso funcionará como se espera.


10
2017-12-17 13:28