while verdadero tipos sentencia que programacion lenguaje for falso else ejemplos decisiones condiciones ciclo c coding-style

tipos - Usando verdadero y falso en C



tipos de decisiones en programacion (14)

1 es el más legible no es compatible con todos los compiladores.

Ningún compilador ISO C tiene un tipo incorporado llamado bool . Los compiladores ISO C99 tienen un tipo _Bool , y un encabezado que typedef''s bool . Por lo tanto, la compatibilidad es simplemente un caso de proporcionar su propio encabezado si el compilador no es compatible con C99 (VC ++ por ejemplo).

Por supuesto, un enfoque más simple es compilar su código C como C ++.

Por lo que puedo ver, hay 3 formas de usar booleanos en c

  1. con el tipo bool, a partir de entonces usando verdadero y falso
  2. definiendo usando preprocesador #define FALSE 0 ... #define TRUE !(FALSE)
  3. Solo para usar constantes directamente, es decir, 1 y 0

¿Hay otros métodos que me perdí? ¿Cuáles son los pros y los contras de los diferentes métodos?

Supongo que el más rápido sería el número 3, 2 es más fácil de leer aún (aunque la negación a nivel de bits aumentará ligeramente la sobrecarga), 1 es más legible y no es compatible con todos los compiladores.


Con el tipo bool definido stdbool.h, surgen problemas cuando necesita mover el código de un compilador más nuevo que admita el tipo bool a un compilador más antiguo. Esto podría suceder en un entorno de programación integrado cuando se mude a una nueva arquitectura con un compilador de C basado en una versión anterior de la especificación.

En resumen, me quedaría con las macros cuando la portabilidad es importante. De lo contrario, haga lo que otros recomiendan y use el bulit en tipo.


Cualquier int distinto de cero es verdadero; falso es cero De esa manera, un código como este sigue funcionando como se esperaba:

int done = 0; // `int` could be `bool` just as well while (!done) { // ... done = OS_SUCCESS_CODE == some_system_call (); }

OMI, bool es un tipo sobrevaluado, tal vez un traspaso de otros idiomas. int funciona bien como un tipo booleano.


Cualquiera de los tres con los que vayas, compara tus variables con FALSO o falso.

Históricamente, es una mala idea comparar algo con verdadero (1) en c o c ++. Sólo falso se garantiza que sea cero (0). Verdad es cualquier otro valor . Muchos proveedores de compiladores tienen estas definiciones en algún lugar de sus encabezados.

#define TRUE 1
# define FALSO 0

Esto ha llevado a demasiadas personas por el sendero del jardín. Muchas funciones de la biblioteca, además del tipo de gráfico, devuelven valores distintos de cero que no son iguales a 1 en caso de éxito. Existe una gran cantidad de códigos heredados con el mismo comportamiento.


Me gustaría 1. No he encontrado incompatibilidad con él y es más natural. Pero, creo que es una parte de C ++ no C estándar. Creo que con el hacking sucio con define o su tercera opción, no obtendré ningún rendimiento, pero solo será difícil mantener el código.


No hay diferencia de velocidad real. Realmente son todos iguales al compilador. La diferencia es que los seres humanos intentan usar y leer tu código.

Para mí, eso hace que bool, true y false la mejor opción en código C ++. En el código C, hay algunos compiladores que no son compatibles con bool (a menudo tengo que trabajar con sistemas antiguos), por lo que podría ir con la definición en algunas circunstancias.


No sé tu situación específica. Cuando estaba escribiendo programas en C, siempre hemos usado el # 2.

#define FALSE = 0 #define TRUE = !FALSE

Esto podría ser de otra manera bajo la plataforma alienígena para DOS o procesadores basados ​​en Intel. Pero solía usar C y ASM juntos escribiendo bibliotecas gráficas e IDE gráfico. Yo era un verdadero fanático de Micheal Abrash y tenía la intención de aprender sobre el mapeo de texturas y demás. ¡De todas formas! ¡Ese no es el tema de la pregunta aquí!

Esta fue la forma más utilizada para definir los valores booleanos en C, ya que este archivo de cabecera stdbool.h no existía en ese momento.


Normalmente hago un:

typedef enum {FALSE = 0, TRUE} boolean;


Prefiero (1) cuando defino una variable, pero en expresiones que nunca comparo con verdadero y falso, simplemente tome la definición implícita de C (indicador) o if (! Flag) o if (ptr). Esa es la manera C de hacer las cosas.


Prefiero la tercera solución, es decir, usar 1 y 0, porque es particularmente útil cuando tiene que probar si una condición es verdadera o falsa: simplemente puede usar una variable para el argumento if.
Si usa otros métodos, creo que, para ser coherente con el resto del código, debería usar una prueba como esta:

if (variable == TRUE) { ... }

en lugar de:

if (variable) { ... }


Puede probar si bool está definido en c99 stdbool.h con

#ifndef __bool_true_false_are_defined || __bool_true_false_are_defined == 0 //typedef or define here #endif


Simplemente incluya <stdbool.h> si su sistema lo proporciona. Eso define un número de macros, incluyendo bool , false y true (definido para _Bool , 0 y 1 respectivamente). Vea la sección 7.16 de C99 para más detalles.


Solía ​​usar #define porque hacen que el código sea más fácil de leer, y no debería haber degradación de rendimiento en comparación con el uso de números (0,1) porque el preprocesador convierte #define en números antes de compilar. Una vez que se ejecuta la aplicación, el preprocesador no vuelve a aparecer porque el código ya está compilado.

Por cierto debería ser:

#define FALSE 0 #define TRUE 1

y recuerda que -1, -2, ... 2, 3, etc. todo se evalúa como verdadero.


Solo usa 0 o 1 directamente en el código.

Para los programadores de C, esto es tan intuitivo como verdadero o falso.