Usando verdadero y falso en C

7 minutos de lectura

avatar de usuario
Tomás

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

  1. con el tipo bool, de ahí usando true y false
  2. definir 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 aún más fácil de leer (aunque la negación bit a bit aumentará ligeramente la sobrecarga), 1 es más legible y no es compatible con todos los compiladores.

  • ¿De verdad crees que los compiladores van a esperar hasta el tiempo de ejecución para negar una constante?

    – GManNickG

    12 de febrero de 2010 a las 18:16

  • Para hacer un seguimiento para que no parezca un idiota, ningún compilador perderá el tiempo haciendo eso. Los compiladores son optimizadores pesados, y si saben que los resultados siempre serán los mismos, los incluirán en su lugar. Nunca esperará hasta el tiempo de ejecución para evaluar int i = 12 + 3 * 4;; solo dirá int i = 24;. Preocuparse por el rendimiento como ese es un problema común, no se sienta mal. Llegan las optimizaciones último, y cuando llega, debe cronometrar su código y mirar la salida del ensamblado, no adivinar. Incluso si costara un ciclo, optaría por la solución más legible. Sólo cuando demostró ser un

    – GManNickG

    12 de febrero de 2010 a las 18:21


  • problema cambiaría a una solución más rápida, cronometrándolos para asegurarme de que fueran realmente más rápidos. Cuando se le dé a elegir entre legibilidad y un ciclo, elija legibilidad. 🙂 Es fácil hacer un buen código rápido, pero difícil hacer que el código “rápido” sea bueno.

    – GManNickG

    12 de febrero de 2010 a las 18:23


  • Cuando utilice las macros, recuerde que (x == TRUE) no es lo mismo que (x). Lo primero es cierto sólo si x tiene el valor de TRUE. Esto último es cierto para cualquier valor distinto de cero.

    – Devon_C_Miller

    12 de febrero de 2010 a las 18:24

  • Aconsejo no definir macros booleanas especiales; esto solo tienta a los programadores novatos a escribir cosas como if(foo == TRUE) o if(foo == FALSE)lo cual es una atrocidad en la mayoría de los lenguajes, pero aún más en C, donde cualquier valor escalar != 0 se considera verdadero en contextos booleanos; por razones similares, pero menos graves, no me gusta if(foo != NULL) y if(foo == NULL) para punteros; ya que esto no puede introducir errores en comparación con TRUE puede, es simplemente una cuestión de gusto, pero usar if(foo) y if(!foo) para cualquier valor escalar es imo más en sintonía con la apariencia del lenguaje C

    – Cristóbal

    12 de febrero de 2010 a las 18:57


avatar de usuario
Chris Jester-Joven

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

  • Ningún “bool” es una macro. El tipo es “_Bool”. De lo contrario, rompería terriblemente el código antiguo.

    – Lotario

    12 de febrero de 2010 a las 18:20


  • Puedes usar _Bool sin incluir stdbool.h

    – Cristóbal

    12 de febrero de 2010 a las 18:46

Simplemente use 0 o 1 directamente en el código.

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

  • Para los programadores de C, -1 también es cierto, ya que no es un cero. De hecho, 42 y -234 también son valores verdaderos. He visto -1, -2 y otros valores como verdaderos. Algunas funciones devuelven 0 (cero) como exitosas. Hmmm, tanto por la consistencia.

    – Thomas Matthews

    12 de febrero de 2010 a las 19:04

  • Por lo general, solo veo 1 o -1 como valores verdaderos. -1 porque son todos unos en binario. Me encantaría saber dónde encontraste -2.

    – Mike DeSimone

    12 de febrero de 2010 a las 19:16

  • Estoy de acuerdo con Tomás. El hecho de que 0 se utilice como código de error para “sin error” (y a menudo también como int type) a veces hace que no sea obvio si se supone que un valor debe usarse en un contexto booleano.

    – jamesdlin

    12 de febrero de 2010 a las 19:35

  • Piense en una función que devuelve 0 para ningún error, como si respondiera a la pregunta “¿tuvo algún problema?” – “0=falso=no”. int fail = close(fd); if (!fail) { great(); } else { weep(); }

    – squelart

    14 de febrero de 2010 a las 5:26

  • @squelart: el problema es que muchas funciones que devuelven valores booleanos no tienen esa semántica y devuelven un valor verdadero en caso de éxito, falso en caso de falla. (Por ejemplo, gran parte de la API Win32 está diseñada de esta manera).

    – jamesdlin

    16 de febrero de 2010 a las 4:06

Yo suelo hacer un:

typedef enum {FALSE = 0, TRUE} boolean;

  • ¿Por qué establece explícitamente FALSO = 0? ¿El primer elemento de una enumeración no es automáticamente 0?

    – Lindelof

    13 de agosto de 2011 a las 20:06

  • @lindelof Es solo en caso de que agreguen FileNotFound al principio de esa enumeración. 😉

    – Chris Jester-Young

    13 de febrero de 2013 a las 22:08


  • @lindelof Tiene sentido. Asegurarse de que FALSO sea 0, es lo único importante. TRUE puede ser lo que sea siempre que sea diferente.

    – klutt

    20 de abril de 2019 a las 10:26

Con el tipo bool definido por 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 cambia 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 importa. De lo contrario, haga lo que otros recomiendan y use el tipo integrado.

avatar de usuario
bob wakefield

Cualquiera de los tres que elija, compare sus variables con FALSO o falso.

Históricamente es una mala idea comparar cualquier cosa a verdadero (1) en c o c++. Solo se garantiza que false sea cero (0). cierto es cualquier otro valor. Muchos proveedores de compiladores tienen estas definiciones en algún lugar de sus encabezados.

#define TRUE 1
#define FALSE 0

Esto ha llevado a demasiadas personas por el camino del jardín. Muchas funciones de biblioteca además chartype devolver valores distintos de cero no iguales a 1 sobre el éxito Existe una gran cantidad de código heredado con el mismo comportamiento.

  • He notado que las comparaciones contra VERDADERO fallan contra variables no inicializadas. Es mejor inicializar sus valores booleanos y compararlos con FALSO. Una enumeración es mejor si realmente necesita tres valores; no, sí, y no sé. Inicialice la enumeración para donotknow. No trate la enumeración como si fuera booleana. no lo es

    –Bob Wakefield

    1 de septiembre de 2013 a las 17:39


avatar de usuario
Wallyk

Cualquier int distinto de cero es verdadero; falso es cero. De esa manera, un código como este continúa 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 sobrevalorado, quizás un remanente de otros idiomas. int funciona bien como un tipo booleano.

  • He notado que las comparaciones contra VERDADERO fallan contra variables no inicializadas. Es mejor inicializar sus valores booleanos y compararlos con FALSO. Una enumeración es mejor si realmente necesita tres valores; no, sí, y no sé. Inicialice la enumeración para donotknow. No trate la enumeración como si fuera booleana. no lo es

    –Bob Wakefield

    1 de septiembre de 2013 a las 17:39


avatar de usuario
Nick Van Brunt

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

  • Perdón por mi último comentario, mi función de búsqueda de PDF no funciona. Consulte la sección 7.16 para obtener más información sobre __bool_true_false_are_defined.

    – Chris Jester-Young

    12 de febrero de 2010 a las 18:33

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad